美文网首页我爱编程
Activity之taskAffinity、allowTaskR

Activity之taskAffinity、allowTaskR

作者: 十旋转45度 | 来源:发表于2018-04-16 15:01 被阅读0次

参考: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()方法。

相关文章

网友评论

    本文标题:Activity之taskAffinity、allowTaskR

    本文链接:https://www.haomeiwen.com/subject/hdxekftx.html