采用FLAG_ACTIVITY_CLEAR_TOP退出 多activity 或 整个程序

问题: 
多activity中退出整个程序,例如从A->B->C->D,这时我需要从D直接退出程序。 
网上资料:{ 
finish()和system(0)都只能退出单个activity。杀进程等的等方式都不行~~~ 
解决问题: 
我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。 
在D中使用下面的代码:

Intent intent = new Intent();
intent.setClass(D.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置
startActivity(intent);
finish();//关掉自己  

在A中加入代码:

//Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
//退出
        if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
               finish();
        }
}  

A的Manifest.xml配置成android:launchMode="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全部被清理。所以整个程序退出了。

诗帆个人补充: 
1.可以把A设置成不可见的Acitivity(方法见下面),然后在它的onCreate方法里跳转到“真正”的载入界面 
就可以实现在D中点退出程序按钮时看上去立即退出程序的效果 
2.A必须是程序启动的第一个Activity才能起到这种立即退出的效果,因为Intent.FLAG_ACTIVITY_CLEAR_TOP只会把目标Activity的“上面”的Activity清理掉,而如果目标Activity的“下面”还有Activity(换句话说,目标Activity不在栈底),则finish后只会到他下面的那个Activity,而不是立即退出的效果了 
3.不可见Activity 
在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行: 
android:theme=”@android:style/Theme.NoDisplay” 
这样一来,当这个Activity启动的时候,就不会显示出界面了。

时间: 2024-10-10 09:27:21

采用FLAG_ACTIVITY_CLEAR_TOP退出 多activity 或 整个程序的相关文章

采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序(多activity)

问题: 多activity中退出整个程序,例如从A->B->C->D,这时我需要从D直接退出程序. 网上资料:{ finish()和system(0)都只能退出单个activity.杀进程等的等方式都不行~~~ 解决问题: 我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity. 在D中使

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最优雅的方式

关于退出所有Activity,目前网上比较流行的方式大概有以下几种: ① 使用ActivityManager的方式: ② 自定义一个Activity集合类的方式: ③ 通过发送广播的方式: ④ 通过杀死当前应用进程的方式: 以上方式的具体实现大家可自行谷歌百度,此处不再赘述. 但是这些方式要么不太靠谱,要么有限制,要么不够优雅.今天我们就来说一个简单有效,优雅大方的方式来退出所有的Activity. 原理 先来说一下原理.我们知道,Activity有四种启动模式,分别为:standard(默认模

android开发(41) Fragment中使用POP_BACK_STACK_INCLUSIVE达到一次跳转到栈底。类似Activity的 采用FLAG_ACTIVITY_CLEAR_TOP

需求场景: 在开发中遇到下面这样场景: 1.创建 Fragment A 显示.  这时栈的结构是: 1.Fragment A 2.创建 Fragment B 并 显示.  从下到上看,这时栈的结构是: 2.Fragment B 1.Fragment A 3.创建 Fragment C 并 显示.  从下到上看,这时栈的结构是: 3.Fragment C 2.Fragment B 1.Fragment A 那么,如何从 Fragment C 一次性跳到 Fragment A 呢? 实现: 入栈时,

Android 一次退出所有activity的方法

转自:http://bbs.51cto.com/thread-970933-1.html 因为android的API中没有提供一次性退出的接口所以想要在多activity的程序里面一次性退出的话就要费点功夫了.我是在一个单例对象里面记录activity栈中activity的引用然后在需要退出时遍历一遍finish()掉就可以了.实现步骤如下:1.创建一个单例对象 package com.exit; import java.lang.ref.SoftReference;import java.ut

如何在退出一个activity后,很好的取消AsyncTask继续运行?

问题 当进入一个详细页面,这时程序会弹出一个对话框加载网络数据,可是发现用户经常因为数据加载慢,就快速的退出这个页面,这样反复来回几次后,发现AsyncTask不再继续加载,而是慢慢的等待,查了下个数,是前几个没有及时的关闭,导致当前的异步任务一直在等待. 所以想请教如何在退出一个页面后,也同时关闭对应的异步任务? 初步解决代码方案: public class Task extends AsyncTask<Void, Void, Void>{@Overrideprotected Void do

创建应用程序和Activity之应用程序Manifest文件简介

每个Android项目都包含一个Manifest文件(Android Manifest.xml),它存储在项目层次中的最顶层.Manifest可以定义应用程序及其组件和需求的结构和元数据.它包含了组成应用程序的每一个Activity,Service,Content Provider和Broadcast Receiver的节点,并使用Intent Filter和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的. Manifest文件还可以指定应用程序的元数据(如它的图标,版本号或者主题

弹出dialog后不可点击back返回,用广播退出所有activity

dialog的代码是一个登陆状态异常后弹出,让强制重新登录的弹窗: AlertDialog.Builder builder = new AlertDialog.Builder( getActivity(), android.R.style.Theme_Holo_Light_Panel); builder.setMessage("登录异常,请点退出重新登录"); builder.setPositiveButton("退出", new DialogInterface.O

Android退出时退出所有Activity的通用类,ActivityManager

做Android项目,退出程序时,有时不能退出所有的activity,这时我们就需要在退出时,关闭所有的activity.思路:当activity创建的时候把当前的Activity对象存放起来,等到退出的时候,关闭所有的Activity.为此,写了一个MyApplication类,用于存放所有的Activity.代码如下: import java.util.LinkedList; import java.util.List; import android.app.Activity; /** *