Android生命周期和启动模式

学习Activity生命周期可以使程序更加连贯流畅,而且有利于合理的管理应用的资源

1、返回栈

Android中的Activity是可以层叠的,每启动一个新的活动就会覆盖在原活动之上,然后点击返回会销毁最上面的活动,下面的一个活动就会重新显示出来。
Android是使用任务(TASK)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈。

2、活动状态

每个Activity在其生命周期中最多有四种状态

2.1 运行状态

Activity位于返回栈栈顶

2.2 暂停状态

Activity不在处于栈顶,但是可见

2.3 停止状态

Activity不处于栈顶,也完全不可见

2.4销毁状态

Activity从返回栈中移除

3 Activity生命周期

3.1 onCreate()

Activity第一次被创建的时候调用

3.2 onStart()

Activity由不可见变为可见的时候调用

3.3 onResume()

此时Activity一定处于栈顶,并且处于运行状态

3.4 onPause()

系统准备启动或恢复另一个活动的时候调用。在这个方法中可以释放一些耗CPU的资源,保存一些关键数据,但是需要保证不会影响新的栈顶活动的使用

3.5 onStop()

在Activity完全不可见的时候调用

3.6 onDestroy()

活动被销毁之前调用

3.7 onRestart()

由停止状态变为运行状态时调用

3.8 除了onRestart()方法外,其他方法都是两两相对的,所以有可以分为三种生存期。

3.8.1 完整生存期
onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。
一般在OnCreate()方法中完成初始化操作,在onDestroy()中完成释放内存操作
3.8.2 可见生存期
onStart()到onStop()之间所经历的,就是可见生存期
这个期间内,Activity对于用户总是可见的,用这两个方法合理地管理用户可见资源
3.8.3 前台生存期
onResume()到onPause()之间经历的。

3.9 活动被回收了怎么办

当活动进入到了停止状态,就是有可能被回收的。Activity为我们提供了相应的方法可以保存和恢复Activity销毁之前的数据。(项目中一直没有遇到过需要保存活动被销毁前的数据的情况)
3.9.1 onSaveInstanceState()方法
该方法保证在活动销毁之前一定会被调用。它会携带一个Bundle类型的参数,Bundle用于保存数据。

 @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        //保存数据        String name = "answer";        outState.putSerializable("name", name);    }

3.9.2 恢复数据
onCreate() 方法中有一个Bundle参数,正常情况下该Bundle为空。当执行过onSaveInstanceState() 方法后,Bundle为onSaveInstanceState() 保存的数据。

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.i(TAG, "onCreate: ");        setContentView(R.layout.activity_main);        if(savedInstanceState != null) {            //有数据            String name = savedInstanceState.getString("name");        }    }

4 活动的启动模式

启动模式一共有四种,实际应用中根据不同的需要选择不同的启动模式。可以在< activity >标签中指定启动模式 android:launchMode = “XXXX”

<activity android:name=".RemindActivity"            android:launchMode="standard">activity>

4.1 standard

standard是Activity默认的启动模式。
每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶位置,不会在乎这个Activity是否已经在返回栈中存在,每次启动都会创建新的实例。

4.2 singleTop

在启动Activity时,如果发现返回栈的栈顶已经是该Activity则直接使用它,不会再创建新的Activity实例。

4.3 singleTask

可以很好的解决重复创建栈顶活动的问题。
每次启动Activity时,系统会先检查在返回栈中是存在该活动的实例,如果存在则直接使用该实例,并将这个Activity之上的所有Activity出栈。如果没有该实例则创建一个新的活动实例。

4.4 singleInstance

指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个活动。可以解决共享Activity实例的问题。

5 Activity最佳实践

5.1 知晓当前是哪一个Activity

让所有Activity都继承与自定义的BaseActivity类,在BaseActivity中调用getClass.getSimpleName()方法,就可知道当前所在的是那个Activity了
5.1.1 创建一个BaceActivity类,继承于AppCompatActivity,并重写onCreate()方法。但是不用在AndroidManifest中注册,也不用关联layout。

public class BaseActivity extends AppCompatActivity{    private static final String TAG = "BaseActivity";    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //获取当前所在的Activity        Log.i(TAG, "当前所在的Activity : " + getClass().getSimpleName());    }}

5.1.2 令其他Activity类都继承BaseActivity

public class MainActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

5.1.3 运行效果

5.2 随时退出程序

在有需要的情况下实现直接关闭所有Activity,退出程序
5.2.1 新建一个集合类对所有的Activity进行管理
在Activity管理类ActivityCollector中,通过List来暂存Activity,用addActivity()方法加入Activity, removeActivity()方法移出Activity,用finishAll()方法关闭所有Activity。

public class ActivityCollector {    public static List activityList = new ArrayList<>();    /**     * 添加一个Activity     * @param activity Activity类     */    public static void addActivity(Activity activity) {        activityList.add(activity);    }    /**     * 移除一个Activity     * @param activity Activity类     */    public static void removeActivity(Activity activity) {        activityList.remove(activity);    }    /**     * 关闭所有Activity     */    public static void finishAllActivity() {        for(Activity activity : activityList) {            if(activity != null) {                activity.finish();            }        }    }}

5.2.2 在BaseActivity中使用ActivityCollector中的方法
在onCreate()方法中使用addActivity()方法,将Activity加入List中。在onDestroy()中使用removeActivity()方法,将Activity移出List。

@Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //获取当前所在的Activity        Log.i(TAG, "当前所在的Activity : " + getClass().getSimpleName());        ActivityCollector.addActivity(this);    }    @Override    protected void onDestroy() {        super.onDestroy();        ActivityCollector.removeActivity(this);    }

5.3.3 在需要退出应用的地方调用finishAllActivity()方法

这里写代码片

注:最佳实践的demo下载地址:

http://download.csdn.net/detail/android_03/9766625

更多相关文章

  1. Android重温--触屏事件
  2. android显示RGB565数据图像
  3. Android(安卓)ProgressBar详解以及自定义
  4. 实现Android监控任意控件或按键双击事件方法
  5. Android工程中R类访问不到工程中的资源文件的解决方法
  6. Android(安卓)不得不说的VideoView的一些坑及其解决方案
  7. Android手势源码浅析----手势识别
  8. 在android里做一个竖着的seekbar
  9. View那些事儿(1) -- View绘制的整体流程

随机推荐

  1. android process bar 几种style
  2. Android(安卓)初始化Setup Wizard——Pro
  3. Android Frameworks系列之IMF(一)
  4. 【Android文档】Android界面绘制流程----
  5. android中搭建phonegap开发环境
  6. xmlns:android作用以及自定义布局属性
  7. Android核心技术与实例详解(第2版)
  8. Android源码树添加新的APP(含第三方so、ja
  9. android自带的drawable图标ico名称对应表
  10. android Mainifest权限设置清单