Android四大组件之activity

来源:互联网 发布:mysql 索引覆盖 编辑:程序博客网 时间:2024/06/06 00:03

一、概念:Activity本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上.Activity继承了ApplicationContext这个类

public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}

 

二、生命周期:

1、三种状态:

  • 运行:可见、可交互。它在屏幕最前端,处于栈的最顶端。Android会尽可能的维持它的状态,即使内存不足,Android也会杀死底层的activity,确保activity正常运行
  • 暂停:可见、不可交互 。它依然与窗口管理器保持连接,系统继续维护其内部状态,如:一个透明或者 Dialog 样式的 Activity 覆盖时。
  • 停止:不可见、不可交互。被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped状态。

2、常见的七个方法:

oOnCreate  :一个 Activity 的实例被启动时调用的第一个方法。一般情况下,我们都覆盖该方法作为应用程序的一个入口点,在这里做一些初始化数据、设置用户界面等工作。大多数情况下,我们都要在这里从 xml 中加载设计好的用户界面。

 onStart():方法在 onCreate() 方法之后被调用,或者在 Activity 从 Stop 状态转换为 Active 状态时被调用。到这一步变成“用户可见”的状态;

 onResume:变成和用户可见可交互的,(在Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行 完弹出栈,则回到上一个Activity);

onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。

onStop:变得不可见 也不可交互,被下一个activity覆盖了。

  onRestart:用户后退回到此Activity,系统会先调用方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

onDestroy:这它是被结束时调用的最后一个方法,在这里一般做些释放资源,清理内存等工作onPause,onstop, onDestroy,三种状态下 activity都有可能被系统kill 掉.

    onWindowFocusChanged:在Activity窗口获得或失去焦点时被调用,例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。以上几种情况都会调用onWindowFocusChanged,并且当Activity被创建时是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause之后被调用,如图所示:

 onSaveInstanceState:(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用,无法保证什么时候发生,系统根据资源紧张程度去调度;(2)在用户改变屏幕方向时,此方法会被调用,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,可以保存一些临时数据;(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调.用。        系统调用此方法是为了保存当前口窗各个View组件的状态。onSaveInstanceState的调用顺序是在onPause之前。        

 onRestoreInstanceState:(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。


    3.常见操作函数执行的顺序

            3.1..启动Activity:  OnCreate  -> onStart->onResume

                   3.2.跳转到其他Activity,或按下Home键回到主屏:onSaveInstanceState-> onPause-> onStop

                    3.3.从后台回到前台:onRestart->onStart->onResume

                    3.4弹出对话框或者锁屏:onSaveInstanceState-> onPause

                    3.5在对话框的界面返回:onResume

                    3.6退出: onPause-> onStop->onDestory

                    3.7屏幕翻转:onSaveInstanceState-> onPause-> onStop->onDestory->OnCreate  -> onStart-> onRestoreInstanceState-> onResume(在AndroidManifest.xml中对指定的Activity设置android:screenOrientation="portrait",或者在onCreate方法中指定setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  //竖屏 )

                        3.8为了避免这样销毁重建的过程,在AndroidMainfest.xml中对OrientationActivity对应的<activity>配置android:configChanges="orientation",然后我们再测试一下,然后做了3次的旋转。onConfigurationChanged->onConfigurationChanged->onConfigurationChanged

4.Activity 启动模式

Activity 栈

Android 是通过一种 Activity 栈的方式来管理 Activity 每个应用都有一个任务栈,是用来存放Activity的。除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

standard
singleTop
singleTask
singleInstance
根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity


standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例,并放入任务栈中。。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

singleTop

如果Activity在栈顶的时候,启动相同的不Activity,会创建新的实例,而会调用其onNewIntent方法。

两个Activity名为B1,B2。B1为standard,B2为singleTop。
打开的顺序为B1->B2->B2,则实际的顺序为B1->B2。

打开的顺序为B1->B2->B1->B2,则实际的顺序,为B1->B2->B1->B2。

singleTask

只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity

 destory掉并调用它的onNewIntent方法。

singleInstance

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

有三个ActivityD1,D2,D3,三个Activity可互相启动,D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。


注意:

1、finish()先调用onPause、再调用oStop、最后调用oDestroy

 

 

 

0 0
原创粉丝点击