zoukankan      html  css  js  c++  java
  • Android退出所有Activity最优雅的方式

    关于退出所有Activity,目前网上比较流行的方式大概有以下几种:

    ① 使用ActivityManager的方式;

    ② 自定义一个Activity集合类的方式;

    ③ 通过发送广播的方式;

    ④ 通过杀死当前应用进程的方式;

    以上方式的具体实现大家可自行谷歌百度,此处不再赘述。

    但是这些方式要么不太靠谱,要么有限制,要么不够优雅。今天我们就来说一个简单有效,优雅大方的方式来退出所有的Activity。

    原理

    先来说一下原理。我们知道,Activity有四种启动模式,分别为:standard(默认模式)、singleTop、singleTask、singleInstance。本方式需要使用的就是singleTask启动模式。

    如果设置一个Activity的启动模式为singleTask,那么每次启动此Activity时系统都会检查当前任务栈中是否已经存在此Activity的实例。如果已经存在,则不再创建此Activity新的实例,而是调用已存在的Activity的onNewIntent()方法,并把intent作为此方法的参数传递给它。然后它就会被置于栈顶,并把它之前的所有的Activity移除掉。

    原理实现

    (我们先将进入应用的第一个Activity称为BaseActivity)。明白了基本原理之后就好办了,先将BaseActivity的启动模式设置为singleTask,并重写此Activity的onNewIntent()方法用来结束自己,之后会在此Activity上进入其他Activity进行数量不定的跳转。在需要退出时只需在当前Activity上调用startActivity(this,BaseActivity.class)会首先将除BaseActivity外的所有Activity结束掉,然后会自动调用BaseActivity的onNewIntent()结束掉自己,这样所有Activity都完美的退出了。

    图解实现

    为了便于理解,使用下图演示此方式的具体实现过程。

    代码实现

    第一步:设置BaseActivity的启动模式为singleTask

    android:launchMode="singleTask"

    第二步:重写BaseActivity的onNewIntent()方法

    //声明一个静态常量,用作退出BaseActivity的Tag
    public static final String EXIST = "exist";
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent != null) {//判断其他Activity启动本Activity时传递来的intent是否为空
            //获取intent中对应Tag的布尔值
            boolean isExist = intent.getBooleanExtra(EXIST, false);
            //如果为真则退出本Activity
            if (isExist) {
                this.finish();
            }
        }
    }

    第三步:在需要退出应用的Activity中启动BaseActivity

    Intent intent = new Intent(this,BaseActivity.class);
    //传递退出所有Activity的Tag对应的布尔值为true
    intent.putExtra(BaseActivity.EXIST, true);
    //启动BaseActivity
    startActivity(intent);
    作者:caobotao
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    webapi之fiddler头设置
    ios---setContentOffset
    webapi参数处理get过个参数
    socket网络编程
    logging模块
    configparser模块(拷贝)
    hashlib模块--摘要算法
    异常处理
    面向对象拓展
    反射
  • 原文地址:https://www.cnblogs.com/caobotao/p/5127645.html
Copyright © 2011-2022 走看看