第二行代码学习笔记——第二章(2)

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完全不可见的时候调用

扫描二维码关注公众号,回复: 4123598 查看本文章

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<Activity> 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

猜你喜欢

转载自blog.csdn.net/Android_03/article/details/58229770