APP安全退出 及 Activity的生命周期

面试的时候遇到面试官问:如何退出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),即可解决问题。


猜你喜欢

转载自blog.csdn.net/amaoagou112/article/details/79474712