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

本文探讨了如何安全退出Android应用的两种方法:使用System.exit(0)和通过管理Activity栈。在自定义Application和BaseActivity中,详细解释了如何实现关闭所有Activity。同时,分析了退出时Activity的生命周期变化,以及在不同场景下的状态转换,如横竖屏切换。对于部分情况,建议在关闭所有Activity后调用System.exit(0)以确保完全退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值