活动的返回栈的形式
Android 中的活动是可以层叠的。我们每启动一个新的活动,就会覆盖在原来的活动上,点击Back 就会销毁最上面的活动。
数据层面:使用Task 来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈。
活动的活动状态
1.运行状态:处于返回栈的栈顶
2.暂停状态:活动不再处于栈顶状态但是任然可见,活动处于暂停状态
3.停止状态:活动不再处于栈顶状态,并且不可见。
4.销毁状态:活动从返回栈中移除后
活动的生存期
activivty定义了七个回调方法,覆盖活动生命周期的每一个环节。
1.onCreate()
创建时调用,用于完成活动的初始化操作。
2.onStart()
当活动变不可见为可见的时候调用。
3.onResume()
在准备好与用户进行交互时调用(此时活动位于返回栈的栈顶,并且处于运行状态)
4.onPause()
启动或者恢复另一个活动的时候调用。(这个方法执行速度要快)
5.onStop()
这个方法在活动完全不可见的时候调用。
6.onDestroy()
在活动被销毁之前调用。之后变为销毁状态
7.onRestart()
有停止变为运行之前调用
生存期分两类
- 完整生存期:所有的生存期间的活动
- 可见生存期 ;在这之间的活动是可见的。
- 前台生存期(活动处于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来指定启动模式
- standard 是默认的启动模式(每次启动都会创建一个新的实例)
- singleTop 当当前活动在栈顶了(处于活动状态了),不会再创建新的实例。
- singleTask 在当前真个应用程序中只存在一个实例。(启动一个活动时,系统首先会在返回栈中检查是否存在,如果发现已经存在则直接使用,并且把这个活动以上的活动统统出栈。如果没有那么创建一个活动)
- 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(); //调用静态方法,删除所有的类
}
});
}
}