面试的时候遇到面试官问:如何退出app,退出一个app的时候,activity的生命周期是怎么走的?
先来看第一个问题:如何退出APP?
1.System.exit(0);这种方法是通过关闭虚拟机来退出当前app的,简单粗暴,在我刚参加工作时采用的就是这种方式
2.自定义Application,并创建一个Activity的集合,退出时,关闭所有的Activity即可(此种方法更为常用)
2.1自定义Application,如下:
public class MyApp extends Application{ private List<AppCompatActivity> activities; @Override public void onCreate() { super.onCreate(); activities = new ArrayList<>(); } // 加入Activity public void addActivity(AppCompatActivity activity){ if (!activities.contains(activity)){ activities.add(activity); } } // 删除单个Activity public void delActivity(AppCompatActivity activity){ if (activities.contains(activity)){ activities.remove(activity); activity.finish(); } } // 删除全部Activity public void delAllActivity(){ if (activities!=null&activities.size()>0){ for (AppCompatActivity activity:activities){ // 遍历集合,关闭全部 activity.finish(); } activitys.clear(); System.exit(0); } } }
可以看到此application里写3个关于Activity的方法
2.2自定义BaseActivity,如下:
public class BaseActivity extends AppCompatActivity {
protected List<BaseActivity> activityList = new ArrayList();
private MyApp app;
private BaseActivity oContext;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (app==null){
app = (MyApp) getApplication();
}
oContext = this;//当前activity的上下文赋值
addActivity();
setContentView();
initView();
initData();
}
// 添加的那个Activity
private void addActivity(){
app.addActivity(oContext);
}
// 销毁单个Activity
private void delActivity(){
app.delActivity(oContext);
}
// 销毁所有的Activity
public void exitAPP(){
app.delAllActivity();
}
protected void showToast(String str){
Toast.makeText(oContext,str,Toast.LENGTH_SHORT).show();
}
protected void initData() {
}
protected void initView() {
}
protected void setContentView(){
}
}
2.3所有的Activity都继承BaseActivity,在需要关闭App是调用exitApp()即可。
2.4注意,清单文件里注册自定义Application.
<application
android:name=".base.MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
第二个问题,当exitApp执行时,各Activity生命周期是怎么走的:
先描述场景:A->B->C->B->A,所有的Activity的launchMode是采用默认的,
此时,Activity栈中,从下到上,依次为A,B,C,B,A
调用exitApp(),打印所有的Activity的生命周期可以看出:
03-07 18:14:53.954 18628-18628/com.free.myapp2018 I/zyp: Main_onDestroy
03-07 18:14:53.961 18628-18628/com.free.myapp2018 I/zyp: Second_onDestroy
03-07 18:14:53.968 18628-18628/com.free.myapp2018 I/zyp: Third_onDestroy
03-07 18:14:53.973 18628-18628/com.free.myapp2018 I/zyp: Second_onDestroy
03-07 18:14:53.978 18628-18628/com.free.myapp2018 I/zyp: Main_onPause
03-07 18:14:54.641 18628-18628/com.free.myapp2018 I/zyp: Main_onStop
03-07 18:14:54.642 18628-18628/com.free.myapp2018 I/zyp: Main_onDestroy
底部的Activity是直接走的onDestroy(),最上面的Activity是走的onPause(),onStop(),onDestroy()
补充,关于Activity的横竖屏切换时生命周期:
竖屏->横屏
03-07 18:18:47.177 18628-18628/com.free.myapp2018 I/zyp: Main_onPause
03-07 18:18:47.183 18628-18628/com.free.myapp2018 I/zyp: Main_onStop
03-07 18:18:47.184 18628-18628/com.free.myapp2018 I/zyp: Main_onDestroy
03-07 18:18:47.253 18628-18628/com.free.myapp2018 I/zyp: Main_onCreate
03-07 18:18:47.255 18628-18628/com.free.myapp2018 I/zyp: Main_onStart
03-07 18:18:47.260 18628-18628/com.free.myapp2018 I/zyp: Main_onResume
横屏->竖屏
03-07 18:19:19.678 18628-18628/com.free.myapp2018 I/zyp: Main_onPause
03-07 18:19:19.687 18628-18628/com.free.myapp2018 I/zyp: Main_onStop
03-07 18:19:19.688 18628-18628/com.free.myapp2018 I/zyp: Main_onDestroy
03-07 18:19:19.790 18628-18628/com.free.myapp2018 I/zyp: Main_onCreate
03-07 18:19:19.791 18628-18628/com.free.myapp2018 I/zyp: Main_onStart
03-07 18:19:19.794 18628-18628/com.free.myapp2018 I/zyp: Main_onResume
可以看到:两种屏幕切换的生命周期是一致的,均是先销毁,随后再重新创建
//*************************************后续更新*****************************************//
有小伙伴反映说,采用第二种方式退出app并不能完全退出,在任务管理界面仍然可以看到此应用程序,改进措施为,在第二种方法走完之后,再次调用一次System.exit(0),即可解决问题。