参考:Activity之taskAffinity属性、allowTaskReparenting属性和Android退出整个应用解决方案
Activity 的 affinity 由 taskAffinity 属性定义。 任务的 affinity 由根 Activity 的 affinity 确定。 然而,根据规定,根 Activity 总是位于 affinity 同名的任务中。 因为以“singleTask”和“singleInstance” 模式启动的 Activity 只能位于任务的根部, 所以 Activity 的重新归属仅限于“standard”和“singleTop”启动模式。 (请参阅 launchMode 属性。)
Android退出整个应用解决方案
1、利用SingTask
将主Activity设为SingTask模式,然后在要退出的Activity中转到主Activity,然后重写主Activity的onNewIntent
函数,并在函数中加上一句finish
2、利用历史栈和SingleTop
原理总结: 一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP
这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode=”singleTop”
不会调用oncreate()
,而是响应onNewIntent()
这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP
,然后把A finish()
掉。 栈中A,B,C,D全部被清理。所以整个程序退出了。
3、通过广播来完成退出功能
具体实现过程是这样的:在每个Activity创建时(onCreate时)给Activity注册一个广播接收器,当退出时发送该广播即可。大概的代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter filter = new IntentFilter();
filter.addAction("finish");
registerReceiver(mFinishReceiver, filter);
……
}
private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if("finish".equals(intent.getAction())) {
Log.e("#########", "I am " + getLocalClassName()
+ ",now finishing myself...");
finish();
}
}
};
相信聪明的大家会把上面的代码写在一个基类里面,因为如果你的项目中Activity很多的话,写起来很麻烦,而且也不符合代码规范。
在退出时执行以下代码即可关闭所有界面完全退出程序:
getApplicationContext().sendBroadcast(new Intent("finish"));
使用ActivityLifecycleCallbacks优化:
我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
ActivityLifecycleCallbacks
这个接口有什么用呢?Application 提供有一个 registerActivityLifecycleCallbacks() 的方法,需要传入的参数就是这个
ActivityLifecycleCallbacks 接口,作用和你猜的没错,就是在你调用这个方法传入这个接口实现类后,系统会在每个
Activity 执行完对应的生命周期后都调用这个实现类中对应的方法,请记住是每个!这个时候我们就会想到一个需求实现,关闭所有 Activity !你还在通过继承 BaseActivity 在 BaseActivity 的
onCreate 中将这个 Activity 加入集合???那我现在就告诉你这样的弊端,如果你 App 中打开有其他三方库的 Activity ,这个三方库肯定不可能继承你的 BaseActivity
,这时你怎么办?怎么办?这时 ActivityLifecycleCallbacks 就派上用场了, App 中的所有 Activity
只要执行完生命周期就一定会调用这个接口实现类的对应方法, 那你就可以在 onActivityCreated 中将所有 Activity
加入集合,这样不管你是不是三方库的 Activity 我都可以遍历集合 finish 所有的 Activity
4、使用退出类
现下最流行的方式是定义一个栈,写一个自定义的MyApplication类,利用单例模式去单独对Activity进行管理,
总结:在程序内维护一个activity list,在响应应用程序退出的时候,遍历该list,调用每一个Activity的finish()
方法,然
Android.os.Process.killProcess(android.os.Process.myPid())
或者
System.exit(0)
即可完全退出程序(进程也同时被杀死)。
参考:Activity的启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT
如果已经启动了四个Activity:A,B,C和D。在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在startActivity(intent)
里的intent里添加flags标记,如下所示:
Intent intent = new Intent(this, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
这样启动B Activity,就会把D,C都finished掉,如果你的B Activity的启动模式是默认的(multiple) ,则B Activity会finished掉,再启动一个新的Activity B。
如果不想重新再创建一个新的B Activity,则在上面的代码里再加上:
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//与singleTop功能相同
这样B Activity就会再创建一个新的了,而是会重用之前的B Activity,同时调用B Activity的onNewIntent()
方法。
网友评论