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);
时间: 2024-10-27 09:25:26

Android退出所有Activity最优雅的方式的相关文章

Activity之taskAffinity属性、allowTaskReparenting属性和Android退出整个应用解决方案

allowTaskReparenting属性 属性: android:allowTaskReparenting 除了launchMode可以用来调配Task,的另一属性taskAffinity,也是常常被使用.taskAffinity,是一种物以类聚的思想,它倾向于将taskAffinity属性相同的Activity,扔进同一个Task中.不过,它的约束力,较之launchMode而言,弱了许多.只有当中的allowTaskReparen ting设置为true,抑或是调用方将Intent的fl

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 通过Binder对象 当Activity通过调

Android 退出Activity

在一个Process或一个处理线程中退出Activity可以用context来退出,如下: ((Activity)context).finish(); Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方法. 1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myP

Android:改变Activity切换方式

overridePendingTransition(enterAnim, exitAnim); Intent intent =new Intent(this,item2.class); startActivity(intent); this.finish(); overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right); 要整个应用改切换方式的话,那就用style控制吧 1.在res

Android一次退出所有Activity的方法(升级版)

一.思路和方法: 首先创建一个ActivityManager类来存放Activity的对象. 返回ActivityManager的对象,供BaseActivity来进行操作. 所有其他子Activity都继承BaseActivity. 二.代码实现 ActivityManager 类: package com.example.mydemo; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util

android退出登陆后,清空之前所有的activity,进入登陆主界面

如题: android退出登陆后,清空之前所有的activity,进入登陆主界面 在退出登陆时只需要增加一个intent标志 Intent intent_login = new Intent(); intent_login.setClass(SettingActivity.this,MyActivity.class); intent_login.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //关键的一句,将新的activity置为栈顶 startActiv

Android中加activity退出和进入的动画

清单文件中引用 <activity android:name="com.example.MainActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait" android:theme="@style/Center_Zoom_NoTitle_FullScreen" /> <ac

Android 四大组件------Activity

一.定义软件打开的主activity 当用户点开软件时,系统会默认调用app中声明为"launch"(或者"main")的activity中的onCreate()方法.我们一般在AndroidManifest.xml中定义主activity. <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-fil

Android四种Activity的加载模式(转)

建议首先阅读下面两篇文章,这样才可以更好的理解Activity的加载模式: Android的进程,线程模型: http://www.cnblogs.com/ghj1976/archive/2011/04/28/2031586.html 其中对“Android的单线程模型”的描述,明白Activity的一些注意事项. Android Application Task Activities的关系  http://www.cnblogs.com/ghj1976/archive/2011/04/29/2