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<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()方法
这里写代码片