Android下终止进程的方法

 使用ntsd程序 (若是设置过VS,在VS的装置目录下,比如“C:\Program Files
(x86)\Debugging Tools for Windows
(x86)\ntsd.exe”,也得以在那边下载

  近日在做一个类似与任务管理器的事物,里面有个职能,可以透过这多少个管理器截至掉其他的进程。

ntsd -c q -p PID
ntsd -c q -pn PName

  在Android平台下,停止进程的章程仍旧相比多的。首先指明,此处的“截至进程”,包含了寿终正寝自己进程和截至其他进程两个方面。通过查看SDK文档和网上的有些材料,自己找到一些完结进程的方法。在此地做一些综合和小结,著作的局部音信有可能源于网上已有些随笔和帖子,由于过了相比长日子,所以若发现本文与其余作品雷同,请见谅。

三种方法

一、截至一个活动Activity

一种是运用过程的ID号,将PID换成对应进程ID号即可

  要主动的截止一个活动Activity,(先强调一下,是得了一个平移,而不是过程)众所周知,肯定是finish方法啦,这些就不必置疑了,而且以此措施最后会调用Activity的生命周期函数onDestroy方法,截止近年来的Activity,从任务栈中弹出当前的Activity,激活下一个Activity。当然其他的finish体系方法,我们不在这里做详细座谈,有趣味的同桌可以友善查阅一下SDK
的文档。

一种是应用过程的称谓,将PName换成对应的exe名字即可,比如notepad.exe

二、强制截至目前的经过

为了便于,写了个批处理,将该批处理和ntsd放在一起,使用时进行批处理,采取相应的办法,并输入参数即可。

  强行终止近期过程有六个艺术。(呵呵,这里就是终止进程了)

@ECHO OFF
TITLE 结束使用普通方法无法结束的进程
COLOR 0A
MODE con: COLS=62 LINES=22

:MENU
set tm1=%time:~0,2%
set tm2=%time:~3,2%
set tm3=%time:~6,2%
ECHO.  %date% %tm1%点%tm2%分%tm3%秒 
ECHO.   ========================================
ECHO.   请选择要进行的操作,然后按回车
ECHO.   ────────────────────
ECHO.  1    根据进程号PID结束进程
ECHO.  2    根据进程名称结束进程

ECHO.  0    退出
ECHO.
ECHO.请输入选择项目的序号:

set /p choose=
if "%choose%" equ "" goto MENU
if %choose%==1 goto killusingpid
if %choose%==2 goto killusingname
if %choose%==0 goto END

ECHO. 输入错误,请输入正确的项目序号:
goto MENU

:killusingpid
set choose=
ECHO.请输入进程号PID,然后按回车
set /p proid=
set /a i=0
:kpid
ntsd -c q -p %proid%
if %i% GEQ 10 ( ( echo 结束进程%proid%失败 ) & goto MENU )
set /a i=%i%+1
echo 结束进程%proid%第%i%次
tasklist | findstr /i %proid% && ( goto kpid )
echo 结束进程ID为%proid%的程序成功或进程ID:%proid%不存在
GOTO MENU

:killusingname
set choose=
ECHO.请输入进程的名称(比如notepad.exe),然后按回车
set /p proname=
set /a i=0
:kpname
ntsd -c q -pn %proname%
if %i% GEQ 10 ( ( echo 结束程序%proname%失败 ) & goto Menu )
set /a i=%i%+1
echo 结束程序%proname%第%i%次
tasklist | findstr /i %proname% && goto kpname
echo 结束程序%proname%成功或程序:%proname%未启动

GOTO MENU

:END
exit

  1、killProcess(int pid)            
 例子:android.os.Process.killProcess(android.os.Process.myPid());

 

  对于这个点子,需要详细解释一下。在SDK的文档中,解释如下:

 

Kill the process with the given PID. Note
that, though this API allows us to request to kill any process based on
its PID, the kernel will still impose standard restrictions on which
PIDs you are actually able to kill. Typically this means only the
process running the caller’s packages/application and any additional
processes created by that app; packages sharing a common UID will also
be able to kill each other’s processes.

 

波兰语不佳,不可能可靠翻译,所以希望我们自己精通,免得对大家造成误解。我个人对这句话的解释就是,这多少个办法运用是有规则的:

 

a、将被杀掉的长河 和 当前进程
处于同一个包仍旧应用程序中;

参考:

b、将被杀掉的经过
是由目前应用程序所创办的叠加进程;

https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/cdb-command-line-options

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)

  由于那些措施没有重回值,所以我们也不了然我们的目的经过是否真的退出了。可是,我当下只发现了这一个可以截止另一个进程的措施。

四、退出到主屏幕(记得是对当下过程的拍卖)

  这一个方法,也是脱离当前过程的一个措施。假如我们在经过中创制了许多的Activity,然而又不想关闭时去退出不在任务栈顶的Activity,那么就足以平昔使用那一个主意了。那么些主意是经过查看网上资料看到的。在此先感谢
追梦人
了(他的博客地址:http://www.cnblogs.com/yunfei181/archive/2011/01/24/1943128.html,欢迎我们去探访他的博客)。

功能:当按下重返键时,就重临到主屏幕,并含有参数FLAG_ACTIVITY_CLEAR_TOP,会清理掉当前的位移。

 1     @Override
 2     public boolean onKeyDown(int keyCode, KeyEvent event) {
 3         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // 按下的如果是BACK,同时没有重复  
 4                 Intent home = new Intent(Intent.ACTION_MAIN);  
 5                home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
 6                home.addCategory(Intent.CATEGORY_HOME);  
 7                startActivity(home);  
 8         }
 9         return super.onKeyDown(keyCode, event);  
10     }

  此措施确实停止了当前经过,但是通过Android平台的App
Manager工具去查看的话,使用2.3.3的模拟器,会发现刚刚被终结的过程会以Cached
background
Process的样式存在,并且模拟器给出精通释,说是为了下一次更急速的启航这些历程。

===============================优雅的分割线===============================

【表明】本文系本人原创,转载请讲明著作出处:http://www.cnblogs.com/crazypebble/archive/2011/04/05/2006213.html  
博客园http://www.cnblogs.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图