Android进程同Linux进程根据OOM拥有以下特征的进程被视为前台进程。

2.Android 过程被杀死情况

貌似的话,Android进程被充分死有以下几种植情形:

  1. 点系统经过管理机制回收(Lowmemorykiller):这种方法会按照阈值从那个及多少进行清理
  2. 受没有展开Root的老三在用杀死(使用killBackgroundProcess方法):这种措施就会杀死OOM_ADJ为4之上的历程
  3. 为进行Root的老三正应用杀死(使用force-stop或者kill):理论及来说可以杀死所有进程,但一般只是会清理不系统关键进程和非前台可见进程
  4. 厂商的充分进程功能(force-stop或者kill):理论及来说可以杀死所有进程,包括Linux原生进程
  5. 用户主动“强行终止”进程(force-stop):只能停用第三正在和非system/phone进程使(停用system进程使会促成Android系统重新开)

}

1.Android 历程回收策略

眼看,Android是基于Linux系统的。在Android进程回收策略备受,Android进程与Linux进程根据OOM_ADJ阈值进行分:

  • OOM_ADJ >= 4:比较易于为杀死的过程
  • OOM_ADJ 0 ~ 3:不容易吃杀死的经过
  • OOM_ADJ < 0 :纯Linux进程,非Android进程

当Android系统发现设备内存不足时,会依照阈值从十分至有些杀死进程。

 

具体的oom_adj值的含义我们得翻AOSP中之com.android.server.am.ProcessList
文件(其中自添加了片华语注释):

/** 
 * Activity manager code dealing with processes. 
 */  
final class ProcessList {  
    ...  

    // OOM adjustments for processes in various states:  

    // Adjustment used in certain places where we don't know it yet.  
    // (Generally this is something that is going to be cached, but we  
    // don't know the exact value in the cached range to assign yet.)  
    // 未知进程,通常是用作缓存  
    static final int UNKNOWN_ADJ = 16;  

    // This is a process only hosting activities that are not visible,  
    // so it can be killed without any disruption.  
    // 拥有不可视的Activity的进程,可以不影响影响用户的情况下杀掉  
    static final int CACHED_APP_MAX_ADJ = 15;  
    static final int CACHED_APP_MIN_ADJ = 9;  

    // The B list of SERVICE_ADJ -- these are the old and decrepit  
    // services that aren't as shiny and interesting as the ones in the A list.  
    // 一些旧的服务进程  
    static final int SERVICE_B_ADJ = 8;  

    // This is the process of the previous application that the user was in.  
    // This process is kept above other things, because it is very common to  
    // switch back to the previous app.  This is important both for recent  
    // task switch (toggling between the two top recent apps) as well as normal  
    // UI flow such as clicking on a URI in the e-mail app to view in the browser,  
    // and then pressing back to return to e-mail.  
    // 用户使用的前一个进程  
    static final int PREVIOUS_APP_ADJ = 7;  

    // This is a process holding the home application -- we want to try  
    // avoiding killing it, even if it would normally be in the background,  
    // because the user interacts with it so much.  
    // 主界面进程  
    static final int HOME_APP_ADJ = 6;  

    // This is a process holding an application service -- killing it will not  
    // have much of an impact as far as the user is concerned.  
    // 持有应用服务的进程  
    static final int SERVICE_ADJ = 5;  

    // This is a process with a heavy-weight application.  It is in the  
    // background, but we want to try to avoid killing it.  Value set in  
    // system/rootdir/init.rc on startup.  
    // 重量级应用进程  
    static final int HEAVY_WEIGHT_APP_ADJ = 4;  

    // This is a process currently hosting a backup operation.  Killing it  
    // is not entirely fatal but is generally a bad idea.  
    // 执行备份操作的进程  
    static final int BACKUP_APP_ADJ = 3;  

    // This is a process only hosting components that are perceptible to the  
    // user, and we really want to avoid killing them, but they are not  
    // immediately visible. An example is background music playback.  
    // 拥有用户可感知组件的进程  
    static final int PERCEPTIBLE_APP_ADJ = 2;  

    // This is a process only hosting activities that are visible to the  
    // user, so we'd prefer they don't disappear.  
    // 拥有用户仅可见、不可交互的Activity的进程  
    static final int VISIBLE_APP_ADJ = 1;  

    // This is the process running the current foreground app.  We'd really  
    // rather not kill it!  
    // 前台运行的进程  
    static final int FOREGROUND_APP_ADJ = 0;  

    // This is a system persistent process, such as telephony.  Definitely  
    // don't want to kill it, but doing so is not completely fatal.  
    // 系统常驻进程  
    static final int PERSISTENT_PROC_ADJ = -12;  

    // The system process runs at the default adjustment.  
    // 系统进程  
    static final int SYSTEM_ADJ = -16;  

    // Special code for native processes that are not being managed by the system (so  
    // don't have an oom adj assigned by the system).  
    // 为native进程保留,他们不被系统管理  
    static final int NATIVE_ADJ = -17;  

    ...  
}  

首不行运行效果一样,故不再截图。

startService(intent);

图片 1

经过的等级如下:

oom_adj值为2,进程也具有前台服务之可见进程。

劳过程(Service
process):拥有一个在运作的Service的历程。通常这种过程都是不可见的,会在运行比较丰富的时节后考虑降回收掉。

WindowManager.LayoutParams layoutParams = window.getAttributes();

@Override

super.onCreate();

持有Activity运行于屏幕最前头端的长河。(已调用Activity的onResume方法)

OOM_ADJ 0 ~ 3:不易于给杀死的进程

// This is a process holding an application service — killing it will not

publicvoidonCreate() {

}

// 持有应用服务的经过

有在实行的Service的回调方法的长河。(Service的onCreate、onStart、onDestroy方法)

super.onCreate();

// system/rootdir/init.rc on startup.

}

[java]view
plaincopy

.setWhen(System.currentTimeMillis());

builder.setOverrideDeadline(0);

}

@Nullable

super.onDestroy();

intentFilter.addAction(Intent.ACTION_SCREEN_ON);

// user, so we’d prefer they don’t disappear.

unregisterReceiver(receiver);

@Override

@Override

super.onDestroy();

returnfalse;

// This is the process running the current foreground app.  We’d really

运用Native进程拉活

@Override

Log.d(TAG,”work service onCreate”);

intentFilter.addAction(Intent.ACTION_SCREEN_OFF);

主Activity依旧,开启Service后关闭:

publicvoidonReceive(Context context, Intent intent) {

更多详细的经过优先级内容好参考Android官方文档:

publicIBinder onBind(Intent intent) {

Log.d(TAG,”fake service onDestroy”);

Log.d(TAG,”work service onDestroy”);

super.onDestroy();

图片 2

publicvoidonCreate() {

JobService和JobScheduler是Android5.0(API
21)引入的新API,我们得以经过该机制来拉在我们的Service所在经过。

publicvoidonDestroy() {

每当结果进程一段时间后,服务过程被自动还开了,但这Intent变成了空值:

privatestaticfinalString TAG =”MyLog”;

publicIBinder onBind(Intent intent) {

*/

START_REDELIVER_INTENT效果:

instance =this;

setContentView(R.layout.activity_main);

Notification.Builder builder =newNotification.Builder(this);

// 主界面过程

图片 3

[java]view
plaincopy

// 关闭FakeService,关闭Notification

// 拥有不可视的Activity的长河,可以无影响影响用户之情况下杀掉

@Nullable

SCREEN_ON屏幕亮起与齐,在此便不吃来显示了。

.setContentTitle(“fake”)

}

staticfinalintSERVICE_ADJ =5;

安确保Native进程的唯一:设计成C/S模式,主进程以及Native进程经过Localsocket进行通信

}

returnnull;

Window window = getWindow();

staticfinalintFOREGROUND_APP_ADJ =0;

// This is a process only hosting activities that are not visible,

returnSTART_REDELIVER_INTENT;

图片 4

// don’t want to kill it, but doing so is not completely fatal.

staticfinalintPERSISTENT_PROC_ADJ = -12;

}

super.onCreate(savedInstanceState);

率先,JobService只适用于Android5.0上述的体系;其次,当进程被force-stop指令杀死后,JobService依旧无法拉在进程。

@Override

instance =null;

break;

.setContentText(“I am fake”)

}

// OOM adjustments for processes in various states:

采用体系Service机制拉活

registerReceiver(receiver, intentFilter);

}

OnePixelActivity.instance.finish();

每当了解完Android进程的优先级与Android进程的回收策略后,我们保活Android进程的思路就是发了点儿地方:

break;

layoutParams.x =0;

stopForeground(true);

Log.d(TAG,”service onCreate”);

图片 5

privatestaticfinalString TAG =”MyLog”;

// 开启服务前台运行

// so it can be killed without any disruption.

}

privatestaticfinalString TAG =”MyLog”;

}

privatestaticfinalString TAG =”MyLog”;

}

protectedvoidonCreate(Bundle savedInstanceState) {

使kill指令杀掉后:

下面让出Service的例证,我们当启动服务经常采取registerReceiver注册监听器,然后在取消服务经常注销监听器:

returnfalse;

值得注意的是Intent.ACTION_SCREEN_ON与Intent.ACTION_SCREEN_OFF只有经Context.registerReceiver方法注册的播放接收器才会监听到,官方说如下:

装有着运行的BroadcastReceiver的长河。(已调用BroadcastReceiver的onReceive方法)

// UI flow such as clicking on a URI in the e-mail app to view in the browser,

运JobScheduler机制拉活

Log.d(TAG,”screen_on”);

经过提升Android进程优先级,使得进程又难以让回收

// switch back to the previous app.  This is important both for recent

}

// 执行备份操作的长河

// 起起坐标

staticfinalintVISIBLE_APP_ADJ =1;

super.onCreate(savedInstanceState);

publicclassWorkServiceextendsService {

首糟运行效果等同,故不再截图。

privatestaticfinalString TAG =”MyLog”;

WorkService(工作之Service)代码如下:

staticfinalintSYSTEM_ADJ = -16;

// and then pressing back to return to e-mail.

publicvoidonCreate() {

这种方式与运体系广播拉在类似,我们透过反编译第三正值的红应用,监听外发广播拉在我们的历程。

@Override

activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

IntentFilter intentFilter =newIntentFilter();

肯定,Android是基于Linux系统的。在Android进程回收策略备受,Android进程以及Linux进程根据OOM_ADJ阈值进行区分:

setContentView(R.layout.activity_one_pixel);

jobScheduler.schedule(builder.build());

动Notification提升权限

这种方式所存在的老毛病是:需要开展账号授权和一道服务。

Android 进程保活思路

* Activity manager code dealing with processes.

START_STICKY_COMPATIBILITY与START_STICKY类似,是其配合的本,该参数并无包证onStartCommand方法会被调用。

Log.d(TAG,”work service onCreate”);

当Android系统发现设备内存不足时,会按部就班阈值从很及多少杀死进程。

Log.d(TAG,”service onDestroy”);

// This is a process currently hosting a backup operation.  Killing it

returnnull;

FakeService.instance.stopSelf();

具体的oom_adj值的意义我们可查看AOSP中之com.android.server.am.ProcessList
文件(其中自添加了有国语注释):

}

而是该方式也时有发生通病:首先,能了解及产生啊外发广播取决于我们倒编译应用的略微;其次,在这些使用创新版本后,外发广播可能会见吊销掉,因此并无是特意可靠。

// The system process runs at the default adjustment.

Android
进程常驻(3)—-native保活5.0之下方案推演过程与代码详述

builder.setPersisted(true);

}

}

先是我们通过连续JobService类来实现协调之Service,记得重写onStartJob和onStopJob方法。然后我们当onCreate方法中通过JobScheduler来调度我们的Service,值得注意的是用把参数设置为Persisted:

instance =this;

Android 进程优先级

首不善运行:

instance =null;

super.onDestroy();

Native进程如何感知主进程的去世:利用文件锁,而未轮询来判定主进程是否死亡,有利于性能

}

}

// 系统经过

staticfinalintUNKNOWN_ADJ =16;

// user, and we really want to avoid killing them, but they are not

[java]view
plaincopy

咱们得在Manifest中注册广播接收器监听系统广播,在接受至广播时翻我们的过程是否被回收,如果被回收则进行自启。

// 系统常驻进程

// background, but we want to try to avoid killing it.  Value set in

Log.d(TAG,”onCreate”);

图片 6

startForeground(1, builder.build());

[java]view
plaincopy

START_STICKY_COMPATIBILITY效果,我们管代码中onStartCommand的归值改化了START_STICKY_COMPATIBILITY:

[java]view
plaincopy

staticfinalintPREVIOUS_APP_ADJ =7;

@Override

接下来我们于adb shell中应用kill指令把该过程杀死。

// Special code for native processes that are not being managed by the system (so

Intent activityIntent =newIntent(context, OnePixelActivity.class);

super.onCreate();

JobScheduler jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE);

}

.setContentTitle(“fake”)

[java]view
plaincopy

// 前台运行的历程

// 用户采取的面前一个过程

动用第三方以广播拉活

}

// 设置实行延迟

Log.d(TAG,”onStartJob”);

图片 7

然而用专注的凡,并非有广播都能够吃Manifest注册之播音接收器接收及,有些类似于SCREEN_ON等广播只有通过Context.registerReceiver方法注册之播音接收器才会吸纳及,具体的我们可查Android官方的文档说明。

1像素Activity:

// immediately visible. An example is background music playback.

protectedvoidonCreate(Bundle savedInstanceState) {

Native进程如何拉活主进程:通过am命令进行拉活,并指定“–include-stopped-packages”参数来拉活主进程处于force-stop状态的动静

staticfinalintCACHED_APP_MAX_ADJ =15;

publicintonStartCommand(Intent intent,intflags,intstartId) {

FakeService代码:

https://developer.android.com/guide/components/processes-and-threads.html

if(OnePixelActivity.instance !=null) {

OOM_ADJ < 0 :纯Linux进程,非Android进程

builder.setSmallIcon(R.mipmap.ic_launcher)

builder.setSmallIcon(R.mipmap.ic_launcher)

以JobService和将Service设置也Persisted都待我们当Manifest中配备相应的参数:

// because the user interacts with it so much.

publicclassScreenBroadcastReceiverextendsBroadcastReceiver {

// This is a process only hosting components that are perceptible to the

// Adjustment used in certain places where we don’t know it yet.

// This is the process of the previous application that the user was in.

publicbooleanonStopJob(JobParameters params) {

.setWhen(System.currentTimeMillis());

}

这种方式有几桩挑战:

Intent intent =newIntent(this, WorkService.class);

末了因相同摆设合计导图来总结上述Android 进程保活的始末:

.setContentText(“I am fake”)

图片 8

点系统经过管理机制回收(Lowmemorykiller):这种方法会按照阈值从大至多少进行清理

然后我们照样以adb shell中利用kill指令把欠过程杀死。

Android
进程常驻(4)—-native保活5.0上述方案推演过程以及代码详述

@Override

// is not entirely fatal but is generally a bad idea.

}

// 一些初的服务过程

用户积极“强行终止”进程(force-stop):只能停用第三正及非system/phone进程使(停用system进程使会招致Android系统更开)

// don’t have an oom adj assigned by the system).

图片 9

编写广播接收器监听锁屏和解锁action:

@Override

receiver =newScreenBroadcastReceiver();

// services that aren’t as shiny and interesting as the ones in the A list.

近来攻读了有关Android进程保活的相干文化,在这状下一致首博客总结下。

context.startActivity(activityIntent);

staticfinalintSERVICE_B_ADJ =8;

layoutParams.width =1;

}

要用保证我们的以所在进程存活,那么我们就是该先了解一下Android网受经过的归类。

publicclassOnePixelActivityextendsActivity {

}

layoutParams.height =1;

享有系统重要性特性的Service,如动态壁纸、输入法等服务。

publicclassMainActivityextendsAppCompatActivity {

super.onCreate();

// rather not kill it!

// 设置持续运作

// 未知进程,通常是因此作缓存

Notification.Builder builder =newNotification.Builder(this);

// 拥有用户仅仅可见、不可互相的Activity的长河

finalclassProcessList {

// avoiding killing it, even if it would normally be in the background,

}

Log.d(TAG,”work service onStartCommand”);

publicstaticFakeService instance =null;

// don’t know the exact value in the cached range to assign yet.)

行使Activity提升进程等

转自:http://blog.csdn.net/superxlcr/article/details/70244803?ref=myread

空进程(Empty
process):不含有任何活动以组件的长河。保留这种经过的的绝无仅有目的是故作缓存,以缩短下次当里面运行组件所急需的开行时间。
为要整体系统资源在经过缓存和脚基础缓存中保持平衡,系统往往会停这些经过。

// 清除实例

当我们采用Service时,可以由此再写onStartCommand方法的回来值来保证我们的进程被杀后重新开。总的来说,返回值有以下4独:

publicvoidonDestroy() {

// have much of an impact as far as the user is concerned.

publicvoidonCreate() {

Intent intent =newIntent(this, FakeService.class);

super.onCreate(savedInstanceState);

https://developer.android.com/guide/topics/processes/process-lifecycle.html

startService(intent);

setContentView(R.layout.activity_main);

Android 进程回收策略

前台进程(Foreground
process):指用户眼前操作必须的历程。一般的话,系统面临独存在极少的前台进程,而且她会暨最终才给回收掉。拥有以下特点的经过被视为前台进程:

publicvoidonCreate() {

图片 10

这种方法原理是:利用Linux中之fork机制创建一个Native进程,在Native进程被监控主进程的水土保持,当主进程挂掉后,在Native进程面临及时对主进程展开拉活

接下来运行服务即可发现,在Service所在经过被坏掉后,我们的Service会自动重新开:

caseIntent.ACTION_SCREEN_OFF: {

publicIBinder onBind(Intent intent) {

window.setGravity(Gravity.START | Gravity.TOP);

super.onCreate();

Log.d(TAG,”activity onCreate”);

// This is a process with a heavy-weight application.  It is in the

publicclassFakeServiceextendsService {

具有一个前台Service。(通过用startForeground)

Intent intent =newIntent(this, WorkService.class);

行使体系广播拉活

// 保存实例

图片 11

publicstaticOnePixelActivity instance =null;

@Nullable

}

Log.d(TAG,”activity onDestroy”);

JobInfo.Builder builder =newJobInfo.Builder(1,newComponentName(this, MyJobService.class));

// 关闭一如素Activity

@Override

以Android进程死后进行拉活

@Nullable

@Override

欠方式仍然有它的弱点:

[java]view
plaincopy

图片 12

// This is a process holding the home application — we want to try

于杀死进程一段时间后,服务过程被活动还开了,此时Intent参数是非空的:

下一场我们照例在adb shell中应用kill指令把该过程杀死。

returnnull;

利用账号并机制进行拉活

拖欠方法的瑕疵也深明白:首先,广播接收器被管理软件、系统软件通过“自启管理”等作用禁用的光景无法吸纳到广播,从而无法自启;其次,这种方法吗无法确保进程挂掉后及时拉在。

当我们回去了START_REDELIVER_INTENT时,我们得Service所在经过被杀后,系统以会重开我们的Service,并且以调用onStartCommand方法时,会发送最后传送的Intent。

@Override

Log.d(TAG,”screen_off”);

}

}

break;

厂商的不得了进程功能(force-stop或者kill):理论及吧可以杀死所有进程,包括Linux原生进程

@Override

图片 13

@Override

当我们回去START_STICKY时,如果我们的Service所在经过被杀了,系统会活动还开我们的Service,不过以onStartCommand方法中起或会见传导null的Intent参数。

}

privateScreenBroadcastReceiver receiver;

staticfinalintCACHED_APP_MIN_ADJ =9;

startService(intent);

}

staticfinalintBACKUP_APP_ADJ =3;

// 开启服务前台运行,id与FakeService相同均为1

// task switch (toggling between the two top recent apps) as well as normal

而是该方法吗存在正在一定的症结:首先,如果缺日外Service被杀数,那么我们的系统以不再拉自经过;其次,如果我们的过程被抱Root权限的管理工具或体系工具通过force-stop指令停止掉时,将无法还开。

主Activity启动服务后关自身,模拟没有Activity的场面:

// 关闭Notification

经过一些特殊之建制,在经过非常后用其拉活

每当结果进程一段时间后,服务过程被自动还开了,但这Service只实行了onCreate方法,并无履onStartCommand方法:

publicclassMainActivityextendsAppCompatActivity {

switch(action) {

// 开启同诸如素Activity

finish();

于好几启用后台服务场面中,为了防备我们的利用叫第三着下或系统管理工具在锁屏后也省电而为杀死,我们可以通过启动一像素轻重缓急的界面来提升进程等,让过程等由后台进程提升到前台进程。

// 放在左上角

publicclassWorkServiceextendsService {

给进行Root的老三正应用杀死(使用force-stop或者kill):理论及来说可以杀死所有进程,但一般只见面清理不系统主要进程同非前台可见进程

window.setAttributes(layoutParams);

privatestaticfinalString TAG =”MyLog”;

staticfinalintHOME_APP_ADJ =6;

}

运作输出日志如下所示:

@Override

staticfinalintNATIVE_ADJ = -17;

layoutParams.y =0;

// This process is kept above other things, because it is very common to

当我们回到了START_NOT_STICKY时,我们的Service所在经过被杀后拿无见面让另行开。

// 也native进程保留,他们不吃系统管理

publicvoidonDestroy() {

后台进程(Background
process):这是如出一辙种对用户体验没一直影响之长河,系统会当急需内存的时光天天回收这种进程,这种经过通常会有着一个曾调用onStop方法的Activity。

staticfinalintPERCEPTIBLE_APP_ADJ =2;

每当Android中,进程依据主要被分成5级,越高档的进程进一步要,在内存不够回收过程时为会见尤其晚给回收:

protectedvoidonCreate(@NullableBundle savedInstanceState) {

Log.d(TAG,”work service onStartCommand intent :”+ intent);

// (Generally this is something that is going to be cached, but we

装有可视的,但不是于前台的Activity。(已调用onPause方法)(当其他一个个Activity设置也dialog模式时可能出现这种情况)

貌似的话,Android进程被深死有以下几栽情形:

OOM_ADJ >= 4:比较轻让杀之长河

// The B list of SERVICE_ADJ — these are the old and decrepit

default:

caseIntent.ACTION_SCREEN_ON: {//

图片 14

升级Android进程的预先级

String action = intent.getAction();

// 开启真正行事的Service

// 拥有用户可感知组件的经过

returnnull;

[java]view
plaincopy

publicIBinder onBind(Intent intent) {

暨第一栽方法一般,这种办法呢适用于Service在后台提供服务的场景。由于无Activity的因,我们Service所在经过的oom_adj值通常是比较高的,进程等比逊色,容易让网回收外存时清理掉。这时我们得经startForeground方法,把咱的劳动升级也前台服务,提高过程的等。但升级也前台服务得绑定一个相应的Notification,这是咱无情愿看到底。此时咱们好事先以一个Fake
Service来绑定某一个Notification,然后下同一之id绑定我们真的Service,然后关门我们的Fake
Service,此时咱们的Notification会就我们的Fake
Service一齐关闭,但我们实在的Service仍还处在前台运行状态,进程等就获了对应的升级。

[java]view
plaincopy

吃没有展开Root的老三正值采取杀死(使用killBackgroundProcess方法):这种艺术就会杀死OOM_ADJ为4上述的过程

// 宽高为1px

}

Android 进程被杀情况

startForeground(1, builder.build());

privatestaticfinalString TAG =”MyLog”;

测试例子如下:

@Override

图片 15

publicbooleanonStartJob(JobParameters params) {

@Override

而外上述列有的挑战外,在实际编写过程中还有为数不少底问题相当正在咱失去化解,由于博主学识尚浅,在斯无法编码举例,只能引进两篇博客供上:

publicclassMyJobServiceextendsJobService {

protectedvoidonDestroy() {

finish();

@Override

/**

Log.d(TAG,”fake service onCreate”);

staticfinalintHEAVY_WEIGHT_APP_ADJ =4;

@Override

// 重量级应用进程

经过adb
shell可以视,在锁屏前用所处的历程oom_adj值是比高的,锁屏后由于起步了Activity,oom_adj值降低了,进程的路得到了相应的滋长,变得重复难给回收了,这样可肯定水平达到解决我们的以叫第三正应用或系统管理工具在锁屏后也省电而为杀之动静:

首不成运行:

START_STICKY效果,我们将代码中onStartCommand的归来值改成为了START_STICKY:

// This is a system persistent process, such as telephony.  Definitely

看得出进程(Visible
process):正在推行某些用户可见操作的经过。当杀死这些过程时,用户会起早晚之影响。拥有以下特征的过程被视为可见进程:

除却上述拉活方法外,我们还好在Android定期联合账号时展开拉活操作。由于博主于就方面研究不酷,故未发深入描述。

}

@Override

图片 16

[java]view
plaincopy

}

publicclassWorkServiceextendsService {

对Android进程的保活,除了要我们的长河再难给坏死他,我们还足以经过一些方法以咱们的经过被杀后拿其救活。

// This is a process only hosting activities that are visible to the

相关文章