如何安全退出已调用多个Activity的应用

对于单一Activity的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和System.exit()这样的方法。

但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。
当然,网上也有人说可以。
就好像有人问,在应用里如何捕获Home键,有人就会说用keyCode比较KEYCODE_HOME即可,而事实上如果不修改framework,根本不可能做到这一点一样。
所以,最好还是自己亲自试一下。

那么,有没有办法直接退出整个应用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。

可是,在2.2,这个方法失效了。
在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限

android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。

另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。
它需要权限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId="android.uid.system"属性
同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk中添加LOCAL_CERTIFICATE

:=

platform。
而Android.mk是用于在Android源码下编译程序用的。

从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考:

1、抛异常强制退出:
该方法通过抛异常,使程序Force

Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force

Close的窗口。

2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity基类,处理这些共通问题。

时间: 2024-08-24 19:46:19

如何安全退出已调用多个Activity的应用的相关文章

再谈Unity调用Android的Activity

这段时间在研究Unity4.3开发环境下,如何调用由Android SDK4.4.2写的Activity.参考了很多网上的博客,百度出了几十篇大部分都是转载雨松MOMO的,这里必须向雨松MOMO表示敬意!但雨松MOMO写的博客太旧了,不少内容已经过时,我严格按他说的步骤进行,还是出了问题,所以本博客就是告诉大家在Unity4.3+Android SDK4.4.2环境,起动Activity的细节. 我这篇博客不会从零讲起,所以首先给出两个重要的链接,大家应该看一下: 第一个是雨松MOMO的  ht

一个Activity调用另一个Activity的非静态方法

注意:前提是界面二被打开过未关闭,则用此方法即可实现在界面一中调用界面二的方法! 界面一: public class OneActivity extends Activity { @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_one); callTwoActivityMethod(); } /

如何退出调起多个Activity的Application?

1.记录打开的Activity 每打开一个activity,即记录下来,需要关闭时,关闭每一个activity即可. 2.发送特定的广播 在需要结束应用时,发送一个特定广播,每个activity收到此广播,关闭即可 3.递归退出 在每起一个Activity,通过startActivityResult,然后添加flag,在onActivityResult中处理,并递归关闭.

安全退出调用多个Activity的Application

记录调用的Acticity 使用一个list将打开的Activity都存起来,统一finish(). 发送特定广播 为此App下的Acticity定义一个特定广播,当发送此广播时Activity执行finish(). 通过Activity的启动模式 singleTop以及singleTask可以通过启动栈底的Activity同事将此Activityfinish,便可以退出 在Acitivity的onStart()函数中设置setExit(true) MyApplication mApp = (M

采用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中按back键返回上一个activity,如何重新调用上一个activity的oncreate方法?

默认情况下是不会调用的. @Override public void onBackPressed() { String titleStr = edittitle.getText().toString(); String contentStr = editcontent.getText().toString(); if (title.equals(titleStr) && content.equals(contentStr)) { super.onBackPressed(); } else

关于调用系统照相机Activity被销毁问题解决

<activity                  android:name=".visitplan_finish"                  android:configChanges="keyboard|keyboardHidden|orientation" /> 经过实际测试有效. 主要是调用相机返回的是,activity由于横屏等原因自动销毁重建了,导致原有的数据丢失了. 两个解决方法: 方法1.在activity销毁前,保存当前act

Unity调用Android的Activity

之前http://shuxiayeshou.blog.51cto.com/4452347/1932216 写了关于Unity与Android结合所遇到的问题及解决方法 总结一下,Unity做一个简单的场景,AndroidStudio建一个简单的项目,其中MainActivity是要继承自 UnityPlayerActivity的,这样Unity程序可以调用Android端MainActivity的方法了 那如果Android项目中还有一个NewActivity,我们要通过Unity把他打开咋办呢

Android系统篇之----解读AMS远端服务调用机制以及Activity的启动流程

一.为何本文不介绍Hook系统的AMS服务 在之前一篇文章中已经讲解了 Android中Hook系统服务,以及拦截具体方法的功能了,按照流程本文应该介绍如何Hook系统的AMS服务拦截应用的启动流程操作,但是本文并不会,因为在介绍这个知识点之前,还有一件大事要做,那就是得先分析一下Android中应用的启动流程,如果这个流程不搞清楚的话,后面没办法Hook的,因为你都找不到Hook点,当然Hook代理对象倒是很容易获得,如果没有Hook点,是没办法后续的操作的,所以得先把流程分析清楚了,当然现在