关于activity 的activity周期

版权声明:转载请申明出处,谢谢 https://blog.csdn.net/qq_35495763/article/details/86495835

活动的返回栈的形式

Android 中的活动是可以层叠的。我们每启动一个新的活动,就会覆盖在原来的活动上,点击Back 就会销毁最上面的活动。
数据层面:使用Task 来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈。

活动的活动状态
1.运行状态:处于返回栈的栈顶
2.暂停状态:活动不再处于栈顶状态但是任然可见,活动处于暂停状态
3.停止状态:活动不再处于栈顶状态,并且不可见。
4.销毁状态:活动从返回栈中移除后
活动的生存期
activivty定义了七个回调方法,覆盖活动生命周期的每一个环节。
1.onCreate()
创建时调用,用于完成活动的初始化操作。

2.onStart()
当活动变不可见为可见的时候调用。
3.onResume()
在准备好与用户进行交互时调用(此时活动位于返回栈的栈顶,并且处于运行状态)
4.onPause()
启动或者恢复另一个活动的时候调用。(这个方法执行速度要快)
5.onStop()
这个方法在活动完全不可见的时候调用。
6.onDestroy()
在活动被销毁之前调用。之后变为销毁状态
7.onRestart()
有停止变为运行之前调用

生存期分两类

  1. 完整生存期:所有的生存期间的活动
  2. 可见生存期 ;在这之间的活动是可见的。
  3. 前台生存期(活动处于onResume()和onPause()之间经历的)

在这里插入图片描述
用文字描述就是:
onCreate()–>onstart()–>onResume()–>-->将入一个对话框界面–>onPause()–>新界面,然后返回–>onResume()–>…
另外一种情况是
onCreate()–>onStart()–>onResume()–>将要进入新的界面–>onPause()–>onStop()–>将入新的 界面,然后返回–>onRestart()–>onstart()

情形:当一个活动进入停止状态,很可能是要被收回的。
场景:A启动了B,A进入了停止状态,然后系统回收了A?
此时返回A,会出现什么情况?
答:可以正常启动a,不过之心onCreate()方法,A会被重新创建一次。
此时 A中在启动B之前的临时数据丢失?
问题:以上问题如何解决呢?
使用onSaveInstanceState()来保存数据

@override
protected void onSaveInstanceState(Bundle outState){
     super.onSaveInstanceState(outState);
     string tempData="string you just typed"
     outstate.putString("data_key",tempData);
} //在系统回收到活动是会执行这个方法
//再次恢复时调用onCreate()方法用方法进行恢复
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstancestate);
Log.d(Tag,"onCreate");
setContentView(R.id.activity_main);
if(savedInstanceState!=null){
      String tempData=savedInstance.getString("data_key");
      Log.d(TAG,tempData);
}
}
//将取出的值,重新赋值到文本输入框即可。

活动的启动模式
standard、singleTop、singleTask、singleInstance
可以通过在AndroidMainfest.xml 中通过标签指定android:launchMode来指定启动模式

  1. standard 是默认的启动模式(每次启动都会创建一个新的实例)
  2. singleTop 当当前活动在栈顶了(处于活动状态了),不会再创建新的实例。
  3. singleTask 在当前真个应用程序中只存在一个实例。(启动一个活动时,系统首先会在返回栈中检查是否存在,如果发现已经存在则直接使用,并且把这个活动以上的活动统统出栈。如果没有那么创建一个活动)
  4. singleInstance 启动一个新的栈来管理这个活动
    用处:实现两个程序共享这个活动的实例。
    在这里插入图片描述
    问题:如何实现一步退出当前程序的方法
    解决方法:
    用一个专门的集合类对所有的活动进行管理即可。
    实现步骤:
    定义一个类用于存储所有的activity
public class ActivityCollector {

        public static List<Activity> activities=new ArrayList<Activity>();
        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();
            }
        }
}

第二步:
继承Activity 在activity中使用默认的方法

public class BaseActivity extends Activity {//建立一个基本的类来使用
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity", getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

子类的继承与使用

public class Main2Activity extends BaseActivity { //继承BaseActivity 方
                                                  //法,这里容易忘记
    Button DestoryAll;  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //这里会调用BaseActivity 方法
        setContentView(R.layout.activity_main2);
        
        DestoryAll=findViewById(R.id.DestoryAll); //在xml中添加一个按钮
        DestoryAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ActivityCollector.finishAll();  //调用静态方法,删除所有的类
            }
        });
   }
}

猜你喜欢

转载自blog.csdn.net/qq_35495763/article/details/86495835