`
u011467537
  • 浏览: 10778 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用Intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)退出多个Activity的程序

阅读更多

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

Java代码  收藏代码
  1. Intent intent = new Intent();   
  2. intent.setClass(D.this, A.class);  
  3. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置  
  4. startActivity(intent);  
  5. finish();//关掉自己  


在A中加入代码: 

Java代码  收藏代码
  1. //Override  
  2. protected void onNewIntent(Intent intent) {  
  3. // TODO Auto-generated method stub  
  4. super.onNewIntent(intent);  
  5. //退出  
  6.         if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {  
  7.                finish();  
  8.         }  
  9. }  



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启动的时候,就不会显示出界面了。
 

0
0
分享到:
评论
1 楼 砺雪凝霜 2015-01-26  
singleTop模式下,当打开一个activity的时候,如果栈中有该activity实例的话,会直接复用该activity实例,并会把栈中该activity实例上全部结束掉,使用的时候要注意这个问题

相关推荐

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    android-将内容分享到自己的app

    像qq,微信那样 调用代码Intent intent=new Intent(Intent.ACTION_SEND);... intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(Intent.createChooser(intent, "请选择")); 可以选择分享到自己的app

    Andriod接收广播的类

    恢复已经停止的更新下载。 'android.server.checkin.FOTA_RESTART' 通过 OTA 下载并安装操作系统更新。 'android.server.checkin.FOTA_...设备上新安装了一个应用程序包。 'android.intent.action.PACKAGE_ADDED'

    android.intent.action.TIME_TICK

    接收系统的时间流逝的广播,屏幕开启关闭的广播,电量改变的广播。这些广播在清单文件里注册时,看不到效果。在这个例子中通过在一个服务里面用代码注册的方式,成功接收了这些广播。

    android创建桌面快捷方式

    shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); // 快捷图标 ShortcutIconResource iconRes = Intent....

    Android 静默安装和静默卸载(SilentInstaller)

    Intent intent = new Intent("android.intent.action.SILENT_PACKAGE_INSTALL"); intent.putExtra("silent_install_file", "/sdcard/Helloworld.apk"); intent.putExtra("silent_install_auto_start", true);//...

    Android 调用第三方导航(百度、高德、腾讯)以及坐标转换

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); //启动调用 } catch (URISyntaxException e) { Log.e("intent", e.getMessage()); } } else {//未安装 //market为...

    AppInstall.rar

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //调用系统api安装app Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile); intent.setDataAndType...

    aidl2修正版

    项目a的service类里面需要给intent加上intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Android使用intent.getExtras()获取电量信息.rar

    这个例子主要是获取Android系统手机的电量信息,使用了intent.getExtras()方法来获取实现,关于此方法的使用,请参考以下的代码:  public void onReceive(Context context, Intent intent) {//重写onReceiver方法 ...

    ex07_activity_intent.rar_android_ex07_activi_ex07_activity_inten

    些朋友可能对Android系统的手机不太熟悉,相信你见了Android系统的手机后你肯定会喜欢上的,绚丽的界面,好看的字体,彰显华贵和专业。本源码收集的就是android...activity的跳转 1.不带返回值的跳转 2.带返回值的跳转

    switchactivities:从 PendingIntent 发送时,演示 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 的小项目不起作用

    当你启动这个小应用程序时,按下 MainActivity 上的START ACTIVITY A按钮。 然后按活动 A 上的NORMAL SWITCH -> B按钮。 活动堆栈如下所示: TaskRecord{217a0c5a #1150 A=nl.codestone.switchactivities U=0 sz=3...

    android 监听卸载那些事儿

    android.intent.action.PACKAGE_REMOVED和android.intent.action.PACKAGE_ADDED 可以监听别的应用被安装卸载,但不能监听自己被卸载啊。 监听自己被卸载通过前辈们探索发现,只能通过监听系统卸载log如:act=...

    ex07_activity_intent.rar_Intent_android

    ex07_activity_intent 介绍在android中如何使用intent

    android Intent.FLAG大全

    android Intent.FLAG大全

    一键退出程序

    Activity栈底为透明activity,启动其它activity用的tag为Intent.FLAG_ACTIVITY_SINGLE_TOP, 退出时跳转到透明activity 标签为Intent.FLAG_ACTIVITY_CLEAR_TOP。

    android Intent实例

    2009-01-18 Android应用协调器------Intent 关键字: android intent实例 刚起步的时候经常困扰我们的是一些...用获取到的Intent直接调用startActivity(returnIt)就ok了。 今天就说这么多,有更大需求的可以看源代码。

    Android利用Intent.ACTION_SEND进行分享

    安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个ACTION_SEND的Intent,系统就为我们弹出一个应用程序列表。其实在系统的文件管理器中,这应该是我们常用的功能(包括文件的打开Intent....

    android开发使用例子

    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 横竖屏显示 private void changedScreen(){ int request = this.getRequestedOrientation...

Global site tag (gtag.js) - Google Analytics