菜单

manbetx网页手机登录版Android下得了进程的形式

2018年12月27日 - UNIXSolaris

 使用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地图