Android下结束进程的方法

Android下结束进程的方法  
一、结束一个活动Activity
  要主动的结束一个活动Activity,使用finish方法,而且这个方法最后会调用Activity的生命周期函数onDestroy方法,结束当前的Activity,从任务栈中弹出当前的Activity,激活下一个Activity。当然其他的finish系列方法,我们不在这里做详细讨论,有兴趣的同学可以自己查阅一下SDK 的文档。
二、强制结束当前的进程
  强行结束当前进程有两个方法。
  1、killProcess(int pid)              例子:android.os.Process.killProcess(android.os.Process.myPid());
这个方法使用是有条件的:
a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;
b、将被杀掉的进程 是由当前应用程序所创建的附加进程;
c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)
  2、System.exit(int code)             例子:System.exit(0);
  该方法只能用于结束当前进程自身,在程序遇到异常,无法正常执行时,可以通过这个方法强制退出。
  需要注意的是,这两个方法,会导致进程非正常退出,就是说,进程退出时不会去执行onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!
三、结束另一个进程
  要通过一个进程去结束另一个进程。在之前的SDK版本中, 一直使用方法restartPackage(packageName)方法,但是在Android的开发文档中介绍说,这个函数会导致一些问题( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.) ,所以建议大家使用一个新的方法: 

  void killBackgroundProcesses(String packageName)


这里说明了一个问题,如果手机里面的任务管理器实现的时候是用的“restartPackage”,它可能就做了一些动作 直接把人家apk里的service神马的给杀掉了,或是对静态广播也有用哇?这样的话 就可能导致静态广播接收器无效。。。

  由于这个方法没有返回值,所以我们也不知道我们的目标进程是否真的退出了。但是,我目前只发现了这个可以结束另一个进程的方法。


本帖最后由 android_bin 于 2012-6-12 11:01 编辑

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses(packageName);

静默安装/卸载,你需要android.content.pm.IPackageInstallObserver这个类...

四、退出到主屏幕

  这个方法,也是退出当前进程的一个方法。如果我们在进程中创建了很多的Activity,但是又不想关闭时去退出不在任务栈顶的Activity,那么就可以直接使用这个方法了。

http://ask.csdn.net/questions/158

请教一个android广播接收器的问题

  • 0

为什么自己写的程序被一些下手较狠的进程管理器(如360优化大师的一键清理)杀死后,其中的广播就接收不到广播了?

曾做了一个实验:
假设有程序为A,B和C。A使用AlarmManager定时发送广播并接收广播,B为手动发送广播,C为接收广播。其中Intent的Action都为"com.yehe.mei.off.action.TIMEOUT",A、C的广播接收器都为静态注册,并过虑"com.yehe.mei.off.action.TIMEOUT" Action。

1、当A和C同时运行时,A定时发送的广播,A与C都能接收到;当用360杀死C后,A能接收到A定时发送的广播,而C接收不到。

2、当A和C同时运行时,A设定好定时发送广播后,用360将A杀死,C继续运行,时间到后C并没有接收到AlarmManager发送过来的A设定的Intent。

3、杀死A,当B和C同时运行时,通过B手动发送广播,C能接收到B发送过来的广播;当用360杀死C后,通过B手动发送广播,C便不能接收到B发送过来的广播了。

综上述,足以证明360在杀死程序进程后,程序中的广播接收器和通过AlarmManager设置的定时发送Intent功能都全部失效!

可是为什么系统自带的闹钟,用360怎么杀闹钟都能准时闹呢?如何才能实现和系统闹钟一样的强大,小强一样的杀不死?在下正在写一个定时任务的应用,希望大家帮帮忙,谢谢!


在具有root权限的进程管理器清理后,便相当于系统中的强制停止了,广播接收器等自然都不能使用了。为了最大可能地防止被这类有root权限的进程管理器杀掉,可以在程序退出的时候杀掉自己的进程,这样自己的广播接收器还是可以使用的,但那些进程管理器就找不到我们的进程了,因为已经被我们自己杀死了。但是在广播接收器收到广播后,我们的应用里程就会再被创建,因此在处理完广播后要再次杀死我们自己的进程。


startIntent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);



你可能感兴趣的:(Android下结束进程的方法)