活动的生命周期
当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面发挥的游刃有余。
返回栈
首先它是一个栈(后进先出)。
Android中的活动是可以层叠的,每一个新建的活动都会覆盖在上一个活动上。销毁只会销毁最上层的活动。
活动状态
每个活动在其生命周期中最多会有4种状态
- 运行状态 当一个活动位于返回栈的栈顶
- 暂停状态 当一个活动不再位于栈顶,但仍然可见。
- 停止状态 当一个活动不再位于位于栈顶,并不可见。
- 销毁状态 当一个活动从返回栈中移除就变成了销毁状态。
活动的生命周期
完整生存期:
活动在onCreate()和onDestory()之间所经历的。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,在onDestory()中完成释放内存的操作。
onCreate() 每个活动都重写了这个方法,它会在活动第一次被创建时调用。你应该在这个方法中完成活动的初始化操作。
onDestory() 这个方法在活动被销毁时调用,调用后活动变为销毁状态。
可见生存期
活动在onStart()和onStop()之间所经历的。在可见生存期内,活动对于用户中是可见的,即便有可能无法与用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。比如在onStart()中对资源进行加载,在onStop() 中对资源进行释放。
onStart() 这个方法在活动由不可见变为可见时调用
onStop() 这个方法在活动由可见变为不可见时调用
前台生存期
活动在onResume()到onPause()之间所经历的。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我们平时看到和接触最多的也就是这个状态下的活动。
onResume() 这个方法在系统准备好和用户进行交互时调用。此时的活动已定位于返回栈的栈顶,并处于运行状态。
onPause() 这个方法在系统准备去启动或恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的调用。
活动的启动模式
在AndroidManifest.xml中设置其<activity>标签中的launchMode属性
<activity android:name=".NormalActivity"
android:launchMode="XXXX"/>
活动的启动模式有四:
- standard 默认的模式就是此模式。在此模式下,活动的创建并不会做什么检查,活动会重新创建一个。
- singleTop 在此模式下,活动创建时会检测返回栈顶部是否为该活动,如果是的就不会再重新创建。但是如果该活动并不存在于返回栈顶部,则依然会再次创建。
- singleTask 在此模式下,活动创建前会遍历返回栈,如果返回栈中存在该活动就不会再创建新的。
- singleInstance 在此模式下,活动在创建之前会先创建一个额外的返回栈,然后再在该额外的返回栈中创建活动。销毁时,会先销毁默认的返回栈的活动并销毁该返回栈,再销毁额外的返回栈和其活动。
几个活动使用的技巧
知晓当前是在哪一个活动中
先写一个BaseActivity 基类继承AppCompatActivity,并在此类中重写onCreate()方法:
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
}
}
我们在写其他活动时都继承此基类。当我们进入某个活动时,就会在logcat中输出相应的活动。
随时随地退出活动
新建一个ActivityCollector类作为活动管理器,来对所有的活动进行管理。
public class ActivityCollector{
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity){
activitise.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
然后在BaseActivity中修改:
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
之后,如果想退出程序只要调用ActivityCollector.finishAll();
当然还可以在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下:
android.os.Process.killProcess(android.os.Process.myPid());
killPeocess()方法用于杀掉一个进程,它接收一个进程的id参数,我们可以通过myPid()方法来获得当前程序的进程id。需要注意的是,killProcess()方法只能用于杀掉当前程序的进程,我们不能使用这个方法去杀掉其他程序。
启动活动的最佳写法
public class SecondActivity extends BaseActivity {
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);
}
}
我们在SecondActivity 中添加了一个actionStart()
方法,在这个方法中完成了Intent的构建,另外所有SecondActivity 中需要的数据都是通过actionStart()
方法的参数传递。
SecondActivity.actionStart(FirstActivity.this , "data1" , "data2");