活动(Activity)的生命周期

初识活动周期

认识活动周期有什么用呢?
1.可以了解app从创建到被回收所经历的各个过程。
2.当活动被回收时,如何用Bundle传递回收前的数据,以便用户切回该程序继续上次浏览。
3.活动的启动模式有哪四个,如何启动程序。
4.如何真正退出程序。
5.如何知晓当前是哪一个活动。

活动周期

共七个状态:onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory()和onRestart();除了最后一个,前面两两相对。

一、当启动一个程序:
1.onCreate()创建;
2.onStart()开始;
3.onResume()将程序显示在最前面;
二、切换程序,区别onPause()和onStop()。例如:应用程序A调用一个全屏的应用B和非全屏的应用C。
2.1.1、当A打开另一个全屏的应用B:1.A先onPause;2.B:重复上面三个步骤,create、start、resume;3.最后,A onStop();
2.1.2、当B用Back键返回A:1.B先onPause();2.A:onRestart()、onStart()、onResume();2.最后销毁B:onStop()、onDestory();
2.2.1、当A打开另一个应用C(C只占屏幕中间一个小对话框,可以看见C下面的A应用):1.A:onPause();2.C:启动三步骤;
2.2.2、当C返回A:1.C先onPause();2.A:onResume();3.C:onStop()、onDestory();
三、退出应用:
1.onPause();
2.onStop();
3.onDestory()。

总结:当应用程序处于pause状态时仍然可以看见,当处于stop状态时已经看不见了,当处于destory时程序已经被销毁。
知道了程序什么时候pause和stop,那什么时候destory呢?用Back键返回:程序执行到destory销毁;用Home键返回:程序只执行到stop。

活动被回收时怎么办。

程序一旦destory,前一个程序的资源都被回收,切换回前一个程序时要重新onCreate(),前面操作的数据全没了,给用户带来很差的体验。例如以前玩游戏时回QQ消息,切换回游戏时要重新加载。所以,活动被回收时怎么办?用onSaveInsanceState()
onSaveInstanceState()自带一个Bundle类型的参数,Bundle提供了一系列方法保存数据:putString()、putInt()等,以此类推,方法里面需要两个参数:第一个名字,第二个是要保存的内容。

活动的四种启动模式

1.standard(默认),特点是不在乎某活动是否在返回栈中存在,每次都创建新的。
2.singleTop。检查栈顶是不是该活动,是的话直接使用,不是的话再创建。(只检查栈顶,若A切换到B,B返回A时,A还是会被重新创建一遍,因为返回A前栈顶元素是B。)
那么,有没有一种方法只创建一个实例呢?
3.singleTask。检查栈中实例,有的话直接使用,没有的话创建。
举例:修改AndroidManifest中xxxxActivity的启动模式。
在这里插入图片描述
4.singleInstance。不同于前三种启动模式,前三种都是在同一个返回栈中,而singleInstance是给活动新建一个返回栈,栈编号为n+1。这样,返回顺序就会改变。
若:1、2、3在同一个栈中,则返回顺序是3、2、1,
若:3为singleInstance启动模式,则返回顺序是2、1、3。因为启动时,1和2放入N号栈,3由于是singleInstance启动模式,新建了一个栈为N+1号,所以返回时先取空N号栈,再取空后面的栈。
可以通过打印Log.d("某Activity",getTaskId());检验一下。

实践

给启动活动写个方法

当多个人弄一个项目,A与B需要相互传数据时,A需要读B的代码或询问B需要什么数据。此时,B可能心情好告诉A就罢了,万一B思绪飞起,正敲到高潮,A去打断他人思路会略显尴尬,不打断就会拖慢自己的进度。所以,B在写代码时可以给启动活动单独写个方法,A只要输入B的someActivity.就会看到很多方法可以调用,选中一个方法,AS就会提示需要什么参数。A就可以摆脱窘境,B也可以安心码字。
举例:首先,B给启动活动写个方法,供他人调用。//方法里的参数自己定义。

public static void actionStart(Context context, String data1, String data2) {
        Intent intent = new Intent(context, SecondActivity.class);
        intent.putExtra("param1", data1);
        intent.putExtra("param2", data2);
        context.startActivity(intent);
    }

然后,被A调用。
在这里插入图片描述

知晓当前活动

1.其它活动都继承这个父类。
2.在父类中打印日志:Log.d("某Activity",getClass().getSimpleName());

退出程序

假设一个程序打开多个活动,需要多次Back才能退出。但是,我们只需要用一个专门的集合类对所有的活动进行管理就可以了。
1.新建一个类,里面有三个方法:addActivityToList(),removeActivity(),finishAll()。

public class ActivityCollector {
    public static List<Activity> activities = new ArrayList<>();

    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activities.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
        activities.clear();
    }
}

2.修改父类:onCreate里添加ActivityCollector.addActivity(this);,在onDestory里添加ActivityCollector.removeActivity(this);
3.使用:在任意想退出的地方,调用ActivityCollector.finishAll();
finish后可以加一句,杀掉进程:android.os.Process.killProcess(android.os.Process.myPid());

这篇随笔参考《第一行代码——Android》+本人学习时所犯错误总结而成,环境是Android Studio 3.3.1。

猜你喜欢

转载自blog.csdn.net/spicyStrip/article/details/88258618