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

  前段时间在做叁个近似与职责管理器的事物,里面有个功用,可以通过这些管理器截止掉别的的进度。

 

 

adb server is out of date.  killing…
ADB server didn’t ACK
* failed to start daemon *
error: unknown host service

 

行使adb时,若出地方的错,使用adb
kill-server是一贯不用的,因为那时候是其余进度的监听了端口,实际不是adb。作者用cmd+命令管理器消除:

输入netstat -ano | findstr “5037”  

找到下列进度

  TCP    127.0.0.1:5037         0.0.0.0:0              LISTENING       4236  

  TCP    127.0.0.1:5037         127.0.0.1:49422        ESTABLISHED     4236  

  TCP    127.0.0.1:49422        127.0.0.1:5037         ESTABLISHED     3840  

那儿把4236这么些进度甘休就行了。

TASKLIST | findstr “4236”

本人的是被三个叫tadb.exe的勒迫了,貌似是qqmusic的进程,截止它,over

图片 1

在linux系统管理中,大家一时须要收尾掉有些客商的全体进度。初学者一般会先查询出客商的具备pid,然后一条条kill停止掉,恐怕写二个剧本。实际上甘休的办法有十分多,博主那边总计了下边4种办法,以kill顾客zhangnq为例。

1.finish()方法

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

  在Android平台下,截止进度的法子依然非常多的。首先指明,此处的“甘休进度”,饱含了结束本身进度和终结别的进度五个方面。通过翻看SDK文书档案和英特网的一部分素材,本身找到一些告终进度的秘籍。在此间做一些综合和小结,小说的一些新闻有十分的大只怕出自网十一月有的小说和帖子,由于过了对比长日子,所以若觉察本文与其他小说雷同,请见谅。

  1. pkill方式

    # pkill -u zhangnq

  2. killall方式

    # killall -u zhangnq

  3. ps方式 ps列出zhangnq的pid,然后逐个kill掉,比较麻烦。

    # ps -ef | grep zhangnq | awk ‘{ print $2 }’ | xargs kill -9

  4. pgrep方式 pgrep -u参数查出客商的有所pid,然后所有人家kill

    # pgrep -u zhangnq | xargs kill -9

 finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将运动推动后台,并从未马上释放内部存款和储蓄器,活动的资源并未被清理;调用finish()方法会试行Activity.onDestroy()方法,截至Activity生命周期

二种格局

一、截止一个活动Activity

 在开采android应用时,日常通过按重回键(即keyCode
== Key伊夫nt.KEYCODE_BACK)就能够关闭程序,其实很多情形下该利用还在义务里运行着,其实那不是我们想要的结果。

一种是使用进度的ID号,将PID换到对应进度ID号就能够

  要继续努力的竣事多个活动Activity,(先重申一下,是得了三个移动,实际不是经过)家弦户诵,断定是finish方法啦,那么些就不必置疑了,并且那一个格局最终会调用Activity的生命周期函数onDestroy方法,截至如今的Activity,从义务栈中弹出当前的Activity,激活下二个Activity。当然别的的finish体系方法,大家不在这里做详细座谈,风野趣的同学能够自个儿查阅一下SDK
的文书档案。

 

一种是选择进程的称谓,将PName换来对应的exe名字就能够,比方notepad.exe

二、强制停止这两天的进度

  1. Dalvik VM的地头方法

为了便于,写了个批管理,将该批管理和ntsd放在一块儿,使用时实行批管理,采纳相应的不二诀要,并输入参数就可以。

  强行终止如今进度有多少个办法。(呵呵,这里就是终结进度了)

android.os.Process.killProcess(android.os.Process.myPid())
//获取PID,最近收获本人的也唯有该API,不然从/proc中自身的枚举其他进程吧,但是要表明的是,停止别的进度不自然有权力,不然就乱套了。//
建议利用
System.exit(0); //常规java、c#的正统退出法,再次回到值为0意味正常退出  //
不提出利用

@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());

  1. 职分处理器方法(不提议使用)

 

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

先是要注脚该方法运营在Android 1.5 API
Level为3上述才得以,同期须要权限android.permission.RESTART_PACKAGES,大家从来甘休自个儿的package就能够,直接利用ActivityManager类的restartPackage方法就能够,参数为package
name,该类通过getSystem瑟维斯(Context.ACTIVITY_SELacrosseVICE)来实例化ActivityManager对象,这种措施种类提供的,但需求出示注明权限,所以使用中要求综合思索。

 

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.

  1. 听别人说Activity的生命周期

 

意大利语倒霉,无法标准翻译,所以指望大家自个儿清楚,免得对大家形成误会。笔者个人对这句话的分解正是,那几个艺术应用是有原则的:

作者们通晓Android的窗口类提供了历史栈,大家得以由此stack的规律来都行的完成,这里我们在A窗口张开B窗口时在Intent中平素步入标识Intent.FLAG_ACTIVITY_CLEAR_TOP,那样开启B时将会免去该进度空间的具有Activity。

 

a、将被杀掉的历程 和 当前进程处于同七个包照旧应用程序中;

在A窗口中使用下边包车型地铁代码调用B窗口
Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//注意本行的FLAG设置
startActivity(intent);

参考:

b、将被杀掉的经过
是由最近应用程序所创制的叠合进度;

  1. killBackgroundProcesses方法

c、将被杀掉的进度 和 当前进度分享了普通客户的UID。(这里的普通客商,是相对于Root权限的顾客来讲的)

在Android
2.第22中学新增加了三个API能够扶助大家杀死后台进度,可是Android123双重重申其调用的API
Level最小为8,killBackgroundProcesses是android.app.ActivityManager类的艺术,使用时必需在androidmanifest.xml文件中参加KILL_BACKGROUND_PROCESSES那么些权力。即便本类还提供了restartPackage
(String packageName) 方法调用的API
Level为3,但是SDK中早已标识为deprecated,其实他们的法则都是一律的,只可是过去Google的命名格局实在不是很合理,restartPackage的魔法很难让大家联想到是完毕进程。

 

  2、System.exit(int code)            
例子:System.exit(0);

该情势的原型 public void killBackgroundProcesses (String packageName)
唯有贰个参数为package Name,使用方法相比简单。

  该方法只可以用来停止最近进度本人,个人认为在程序境遇非常,不也许平常实施时,能够因而这么些点子强制退出。

ActivityManager am = (ActivityManager)
getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses(“cn.com.android123.cwj”); // API
Level至少为8能力应用

  供给注意的是,那么些办法,会招致进度非平常退出,就是说,进度退出时不会去实践onPause、onStop和onDestroy方法,那么进度很有十分的大希望失掉了封存数据的时机。由此,那多少个章程最棒使用在出现十分的时候!

  1. Dalvik VM
    先是我们得以制作多个空指针的要命,比方TextView.setText方法中进行三个int型的源委,由于setText方法重载了Enclave.string.xxx那样的财富int型内容,不过大家平昔不表明这么些财富,仅仅把String写成了int的值,就能够时有发生四个可怜,这时系统Dalvik
    VM会间接关门你的进程,那招非常实用,CWJ一般平常不揭橥给大家。

  2. Thread.UncaughtExceptionHandler
    有Force
    Close的对话框如何做,其实大家经过重写Android应用程序的Application基类自个儿达成Thread.UncaughtExceptionHandler接口的uncaughtException方法是可以制止出现FC窗口的,客商感到直接退出了同等

三、停止另三个历程

 

  要透过叁个历程去得了另一个历程。在前面包车型大巴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.
),所以提出大家使用八个新的措施: 

8.android2.2之后,假若服务在ondestroy里拉长了start自身,用kill
backgroudprocess常常不能收场自个儿。

  void killBackgroundProcesses)(String packageName)

有一种最新发现的方法,利用反射调用forceStopPackage来结束进程
Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am, yourpkgname); 

需要在manifest里加上shareduid定义
android:sharedUserId="android.uid.system"  

另外加上权限
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission> 

并且采用系统platform签名
因为需要用FORCE_STOP_PACKAGES权限,该权限只赋予系统签名级程序
即可实现强制停止指定程序

  由于这么些情势未有重回值,所以大家也不掌握大家的对象经过是不是确实退出了。不过,小编眼下只开采了那些能够终结另贰个历程的艺术。

四、退出到主荧屏(记得是对当下历程的管理)

  那一个主意,也是退出当前进程的贰个措施。假若大家在进程中开创了重重的Activity,但是又不想关闭时去退出不在职分栈顶的Activity,那么就可以直接使用那个法子了。那些法子是经过查看网络资料来看的。在此先谢谢追梦人
了(他的博客地址:,款待我们去拜望他的博客)。

效果:当按下重临键时,就回来到主显示器,并包罗参数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的款式存在,并且模拟器给出了讲解,说是为了后一次更飞速的开发银行这一个进度。

===============================优雅的分界线===============================

【注明】本文系本身原创,转发请注脚文章出处:  
博客园

发表评论

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

网站地图xml地图