当前位置: 首页 > 科技观察

Android退出应用程序最优雅的方式

时间:2023-03-13 00:24:04 科技观察

一起来看看一些常见的退出方式(不优雅的方式)1.容器式创建一个全局容器存放所有的activity,退出时循环遍历所有的activity。importjava.util.ArrayList;importjava.util.List;importandroid.app.Activity;importandroid.os.Bundle;publicclassBaseActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//添加Activity入栈AtyContainer.getInstance().addActivity(this);}@OverrideprotectedvoidonDestroy(){super.onDestroy();//结束Activity&移除ActivityAtyContainer.getInstance().removeActivity(this);}}classAtyContainer{privateAtyContainer(){}privatestaticAtyContainerinstance=newAtyContainer();privatestaticListactivityStack=newArrayList();publicstaticAtyContainergetInstance(){returninstance;}publicvoidaddActivity(Activityaty){activityStack.add(aty);}publicvoidremoveActivity(Activityaty){activityStack.remove(aty);}/***结束所有活动*/publicvoidfinishAllActivity(){for(inti=0,size=activityStack.size();iif(null!=activityStack.get(i)){activitytyStack.get(i).finish();}}activityStack.clear();}}这个方法比较简单,但是可以看到activityStack持有这个Activity的强引用,也就是说当一个Activity退出的时候不正常的,即使activityStack不释放引用,也会造成内存问题。接下来,我们将看一个类似的方法,但它会更优雅一些。2.广播在BaseActivity中注册广播,退出时发送广播,finish退出publicclassBaseActivityextendsActivity{privatestaticfinalStringEXITACTION="action.exit";privateExitReceiverexitReceiver=newExitReceiver();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);IntentFilterfilter=newIntentFilter();filter.addAction(EXITACTION);registerReceiver(exitReceiver,filter);}@OverrideprotectedvoidonDestroy(){super.onDestroy();unregisterReceiver(exitReceiver);}classExitReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){BaseActivity.this.finish();}}}三、进程类型直接kill当前应用Process结束申请,简单粗暴,而且(wu)有效!android.os.Process.killProcess(android.os.Process.myPid());System.exit(0);ActivityManagermanager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);manager.killBackgroundProcesses(getPackageName());这三种方法都可以达到同样的效果,只是在模拟器上会弹出“Unfortunately,XXXhasstopped”的消息提示框,但确实可以退出应用。可以完成当前Activity(比如我手上的小米note,国内几款ROM的fw层变化太大,使用该方法需谨慎)4.RS优雅风格什么是RS风格?即Receiver+singleTask。我们知道Activity有四种加载模式,singleTask就是其中一种。使用该模式后,在启动Activity时,会先查询当前栈中是否有Activity的实例。如果存在,则将其放在栈顶。并从堆栈中删除它上面的所有活动。我们打开一个应用程序,首先是启动页面,然后完成启动页面。跳转到主页。然后首页会有N次跳转,期间会产生数量不定的Activity,有的会被销毁,有的会驻留在栈中,但是栈底永远是我们的HomeActivity。这使问题简单得多。我们只需要两步就可以优雅地退出应用程序。1、在HomeActivity中注册一个退出广播,和第二个广播一样,只是这里只需要在HomeActivity的一个页面注册即可。2、设置HomeActivity的启动方式为singleTask。当我们需要退出时,只需要startActivity(this,HomeActivity,class),然后发送退出广播即可。上面的代码会先移除栈中HomeActivity上面的所有activity,然后接收广播自己完成。一切都好!没有弹框,无需考虑模型Rom适配。不会有内存问题,就是这么优雅简单!5.SingleTask改版跟小伙伴交流后,很多小伙伴都说注册广播有点麻烦。楼下的大佬提出了一个更简单的方法。这也很简单。1.设置MainActivity的加载方式为singleTask2.重写MainActivity中的onNewIntent方法3.在需要退出的时候给Intent加上exit标签由于很多小伙伴都求源码,我们这里就直接使用代码了表格为大家讲解这个方法。第一步设置MainActivity的加载模式为singleTaskandroid:launchMode="singleTask"第二步重写onNewIntent()方法privatestaticfinalStringTAG_EXIT="exit";@OverrideprotectedvoidonNewIntent(Intentintent){super.onNewIntent(intent);if(intent!=null){booleanisExit=intent.getBooleanExtra(TAG_EXIT,false);if(isExit){this.finish();}}}第三步退出Intentintent=newIntent(this,MainActivity.class);intent.putExtra(MainActivity.TAG_EXIT,true);startActivity(意图);6.Lazystyle这种方法比较简单,只需要下面两步1.将MainActivity设置为singleTask2,把exit出口放在MainActivity中,我们可以看到很多应用都是通过双击home键退出应用,这是基于这个方法。下面是处理双击退出的源码privatebooleanmIsExit;@Override/***双击返回键退出*/publicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_BACK){如果(mIsExit){this.finish();}else{Toast.makeText(这个,"再按退出",Toast.LENGTH_SHORT).show();mIsExit=true;newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){mIsExit=false;}},2000);}returntrue;}returnsuper.onKeyDown(keyCode,事件);}