android 如何实现服务用第三方软件杀死还能重启

如淘宝之类,服务杀死之后一会就重启了,最好是源码。
如淘宝之类,服务杀死之后一会就重启了,最好是源码。

1

7个回答

对于一个service,可以首先把它设为在前台运行:
public void MyService.onCreate() {
super.onCreate();
Notification notification = new Notification(android.R.drawable.my_service_icon,
"my_service_name",
System.currentTimeMillis());
PendingIntent p_intent = PendingIntent.getActivity(this, 0,
new Intent(this, MyMainActivity.class), 0);
notification.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!", p_intent);
Log.d(TAG, String.format("notification = %s", notification));
startForeground(0x1982, notification); // notification ID: 0x1982, you can name it as you will.
}

重要设置-------------------------------
相较于/data/app下的应用,放在/system/app下的应用享受更多的特权,比如若在其Manifest.xml文件中设置persistent属性为true,则可使其免受out-of-memory killer的影响。如应用程序'Phone'的AndroidManifest.xml文件:
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...

设置后app提升为系统核心级别,任何情况下不会被kill掉, settings->applications里面也会屏蔽掉stop操作。

这样设置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)

cat /proc/255/oom_adj

设置后的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)

cat /proc/155/oom_adj

-12 # 这是CORE_SERVER_ADJ
注:init进程的oom_adj为-16(即SYSTEM_ADJ): cat /proc/1/oom_adj

Android相关部分分析:
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代码:
final ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);

if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
updateLruProcessLocked(app, true, true);
}

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ; // 这个常数值为-12。
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app, "added application", app.processName);
}

return app;
}

可见要想成为core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),应用程序需要FLAG_SYSTEM和FLAG_PERSISTENT两个标志,FLAG_SYSTEM指的是应用位于/system/app下,FLAG_PERSISTENT就是指persistent属性。

而对于frameworks/base/services/java/com/android/server/SystemServer.java,则调用
ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 设置成SYSTEM_ADJ,即-16。

原理:
Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。由此带来三个问题:
1) 回收规则: 什么时候回收与回收哪一个?
2) 避免误杀: 如何阻止被回收?
3) 数据恢复与保存: 被回收了怎么办?

Android将进程分为6个等级,它们按优先级顺序由高到低依次是:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3. 次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)

特征:
1.如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程。
2.另外,如果其他进程依赖于它的话,一个进程的等级可以提高。例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要。
3.系统中的phone服务被划分到前台进程而不是次要服务进程.

在android中,进程的oom_adj值也就代表了它的优先级。oom_adj值越高代表该进程优先级越低。文件/init.rc中有以下属性设置:
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
/init.rc中,将PID为1的进程(init进程)的oom_adj设置为SYSTEM_ADJ(-16):

Set init its forked children's oom_adj.

write /proc/1/oom_adj -16

查看本机设置:
cat /sys/module/lowmemorykiller/parameters/adj
0,1,2,7,14,15

回收时机:
文件/init.rc中:
setprop ro.FOREGROUND_APP_MEM 1536 // 6M
setprop ro.VISIBLE_APP_MEM 2048 // 8M
setprop ro.SECONDARY_SERVER_MEM 4096 // 16M
setprop ro.HIDDEN_APP_MEM 5120 // 20M
setprop ro.CONTENT_PROVIDER_MEM 5632 // 22.4M
setprop ro.EMPTY_APP_MEM 6144 // 24M
这些数字也就是对应的内存阈值,一旦低于该值,Android便开始按顺序关闭相应等级的进程。
注意这些数字的单位是page: 1 page = 4 kB。所以上面的六个数字对应的就是(MB): 6,8,16,20,22,24。

查看现在的内存阈值设置:
cat /sys/module/lowmemorykiller/parameters/minfree

要想重新设置该值(对应不同的需求):
echo "1536,2048,4096,5120,15360,23040">/sys/module/lowmemorykiller/parameters/minfree
这样当可用内存低于90MB的时候便开始杀死"空进程",而当可用内存低于60MB的时候才开始杀死"内容供应节点"类进程。

具体的回收实现在ActivityManagerService.java中的函数trimApplications():
1.首先移除package已被卸载的无用进程;
2.基于进程当前状态,更新oom_adj值,然后进行以下操作:
1) 移除没有activity在运行的进程;
2) 如果AP已经保存了所有的activity状态,结束这个AP。
3. 最后,如果目前还是有很多activities 在运行,那么移除那些activity状态已经保存好的activity。

更新oom_adj的值:
在ActivityManagerService.java文件的ComputeOomAdjLocked() 中计算出进程的oom_adj,例如:
if (app == TOP_APP) {
// The last app on the list is the foreground app.
adj = FOREGROUND_APP_ADJ;
app.adjType = "top-activity";
}

Android kernel中的low memory killer
Android的Low Memory Killer根据需要(当系统内存短缺时)杀死进程释放其内存,源代码在kernel/drivers/misc/lowmemorykiller.c中。简单说,就是寻找一个最合适的进程杀死,从而释放它占用的内存。
最合适的进程是:
• oom_adj越大
• 占用物理内存越多

一旦一个进程被选中,内核会发送SIGKILL信号将之杀死:
for_each_process(p) {
……
if(selected == NULL || p->oomkilladj > selected->oomkilladj ||
(p->oomkilladj == selected->oomkilladj && tasksize > selected_tasksize))
{
selected = p;
}
}
if(selected != NULL) {
force_sig(SIGKILL, selected);
}

查看LRU列表:adb shell dumpsys activity
当activitydemo在前台时:
包含Service的进程的优先级比较高,在computeOomAdjLocked中将其分为了两小类:
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if (adj > SECONDARY_SERVER_ADJ) {
adj = SECONDARY_SERVER_ADJ;
app.adjType = "started-services";
app.hidden = false;
}
}
if (adj > SECONDARY_SERVER_ADJ) {
app.adjType = "started-bg-services";
}
完全让进程不被kill是不可能的,我们可以通过一些操作,使进程被kill的几率变小:
1) 提高进程的优先级:

  • 后台操作采用运行于前台的Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高;
  • 按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀).
  • 依赖于其他优先级高的进程;

2) 强制修改进程属性:

  • 在进程中设置:setPersistent(true);
  • 在Manifest文件中设置(如上)。
1

现在不死服务几乎做不到了

1

楼上说的设置为系统应用的,首先,你要安装到system目录就需要权限的问题了,所以正常情况下,在一些有管家软件的手机里面
基本没有杀不死的app或者是服务,如果你说用户把权限都给你了,那么你怎么做都可以,
例如低电量不杀死你的应用,你需要什么权限就给你什么权限。 淘宝也不说所有手机都能起来吧, 在不root的时候 可以考虑使用 ndk 守护进程
http://download.csdn.net/download/yyh352091626/9410153

1

你想干嘛??????

0
u014257012
qeaq 想自己做一个类似推送的功能
大约 3 年之前 回复

如二楼贴的那样,你需要做的是进程保活,一般的保活策略有黑色保活,灰色保活和白色保活,具体可以百度下,这样的帖子挺多的,保活自己的进程就不要在后台做太多耗电或者耗流量的操作,不然用户很容易把你卸载掉

0

manifest 文件中有一个属性可以设置成系统应用~设置了这个属性被杀死后就可以自动重启

0

在程序里静态注册一个广播接收器用来监听系统电池电量的广播。在onReceive里面启动就ok

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android 开发之Service 探索如何保证Service不被杀死或被kill之后自动重启
前言: 在我司项目1.0版本的时候消息是使用的环信、用了之后发现各种bug,各种机型不支持导致app崩溃,于是在2.0版本果断去掉环信,使用了公众号用的那套消息系统(老大自己写的)并做了扩展升级。搞了近半个月终于是搞完了,项目也顺利上线......
Android面试题-service被kill之后怎么让它重启
Android面试题-service被kill之后怎么让它重启
Android Service后台服务进程意外被kill掉之后如何重启
Service组件在android开发中经常用到,经常作为后台服务,需要一直保持运行,负责处理一些不必展示的任务。而一些安全软件,会有结束进程的功能,如果不做Service的保持,就会被其杀掉。那么如何保持Service的运行状态,核心就是利用ANDROID的系统广播,这一不会被其他软件影响的常驻程序触发自己的程序检查Service的运行状态,如果被杀掉,就再起来。 在众多的Intent的acti
Android一个APP检测另一个APP的Service被杀死时自动重启服务
例如:appA要检测启动appB中的service 1.修改B中Service启动时的FLAG @Override public int onStartCommand(Intent intent, int flags, int startId) { flags = START_STICKY; return super.onStartCommand...
Android6.0 打开自启动管理页面(华为、小米)
Android在6.0之后就禁止了APP拉起其他的APP,这样子在一些推送服务无法通过拉起其他APP来接受通知,当你的APP没有在线状态下是收不到推送的,包括华为推送和小米推送,小米推送还好一点,可以通过推送系统的通知实现推送,但是推送自定义消息就无法送达了。当然,如果我们打开了APP的自启动权限后是可以收到华为推送和小米推送的,它通过系统把我们的APP启动起来然后就可以收到推送了。当然,要打开自
App在后台被杀死后重启-重进首页方法
感谢这位哥的思路。 这个问题很常见,基本所有app都会遇到这个问题。但是很多开发者都没有处理。 问题的起因:我的app在进入后台后一段时间,可能被系统干掉了,然后通过多任务键,或者图标再点进去操作,出现xxId为null 经过一番探索发现: app在被系统干掉后,重新进入,是会实例出所有的界面(因为他们都重写了onsaveInstance方法),但是这个界面所有的变量都变为null了(如果...
在Service中发送广播被kill掉的Activity能不能收到?
不能请看下面的实践:在发送广播前,Service会先打印消息,然后再发送广播,当Activity被kill掉后,Service会自动重启,然后继续发送广播,但是此时Activity都被kill了,是收不到广播的。当Activity重启之后能继续接受广播...
app被杀死或者没运行,广播接受者接收消息
广播接受者是Android四大组件之一,日常开发中可能会遇到的问题是假设app被杀死了,注册的广播接受者还能正常接收广播吗,如果发送方:Intent intent=new Intent(); intent.setAction(&quot;&quot;); intent.addCategory(&quot;&quot;); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); thi...
Android 通过JNI实现双守护进程,保证服务不被杀死 源码
对应博文链接:http://blog.csdn.net/yyh352091626/article/details/50542554 杀不死的服务一直是一件很头疼的问题,这边给出源码:Android 通过JNI实现双守护进程,保证服务不被杀死。完美运行在谷歌原生Android5.0系统
linux 杀进程,重启java服务
[quote] #!/bin/bash ps aux|grep java|grep -v grep|awk '{print &quot;kill -9&quot;,$2}'|sh cd /opt/app/ium/bin nohup ./start-web.sh &gt;/dev/null &amp; cd /opt/app/ium_wgh/bin nohup ./start-web.sh &gt;/dev/null &amp; ...
Android APP 主动杀死进程后又重启的情况分析
最近有一个需求,在APP内点击某按钮后跳转到Launcher的某页面,同时杀掉自身APP。 一个很简单的需求,结果实现起来却出现了问题。。。T T 最开始,我就想着直接用  android.os.Process.killProcess(android.os.Process.myPid()); 或者 System.exit(0); 大家知道这两个方法,都可以杀掉当前app的进程,但是当...
Android 关于App被杀死后,如何接收极光推送
作为一个程序媛,我要做到的就是听从上级的安排,有需求就实现。但是有的事情我表示真的很无力啊,就比如标题所说的需求。 因为ios在杀死app后都可以接收到通知,所以不懂的人就会觉得那Android应该都是可以的啊, 这个真是坑了我好多次啊,还有桌面角标也是同样的,人家ios就是系统支持的啊。我的天!! 希望产品经理和项目经理 多多了解一下iOS和Android的一些区别,避免尴尬   1....
Android Service被关闭后自动重启,解决被异常kill 服务
Android Service被关闭后自动重启,解决被异常kill 服务
查找进程的pid并杀死后重启服务——shell简易版
#!/bin/bash #获取XXX项目进程ID SERVICE_NAME="statisticsservice-0.0.1-SNAPSHOT.jar" service_pid=`ps -ef | grep $SERVICE_NAME | grep -v grep | awk '{print $2}'` echo "进程ID为:$service_pid" #杀进程 echo "kil...
实现安卓widget不被kill的方法
widget本身是不会被kill的,widget原本就是一个broadcastreciver,而且是静态的,这就意味着随时发一个订阅过的广播widget都能收到,并且会调用onReceive()方法。widget之所以不能运行了,往往是应为对应的service被kill。要想widget一直运行就要使service被kill了可以重启,service杀不死的方法很多,如:Service是androi
Android之app重启功能实现
记一个小功能重启app 方式一:使用AlarmManger Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); //与正常页面跳转一样可传递序列化数据,在Launch页面内获得 ...
app 在后台时间过长被杀死,及时重启
大家肯定会遇到过app退到后台,同时开启很多其他的应用,这时可能会造成我们的app因内存不足而导致进程被杀死,这时我们在从后台返回我们的app时,就会出现问题,特别是用到Application里面存储的变量时,这时会出现空指针的现象,这时我们就要想办法来解决这个问题。 第一种是直接在登录的时候直接把网络获取的数据存进数据库,用到的时候直接在数据库拿,这样呢可以解决问题,但是这时就要写很多的代码。
android应用常驻后台,避免被第三方杀掉的方法
android应用常驻后台,避免被第三方杀掉的方法
重启adb的命令行
首先进入目录时,先直接输盘符,不要每次都忘了 然后 cd di(目录) 操作如下 d: cd D:\Android\64\adt-bundle-windows-x86_64-20140624\sdk\platform-tools 再输入杀死adb的命令 adb kill-server 然后再输入开启adb的命令: adb start-server 出现successful就
android杀死进程后重启进程情况分析
1. 应用程序内就是普通的启动了activity,这时候杀死进程android.os.Process.killProcess(android.os.Process.myPid()),进程就杀死了。 2. 应用程序内如果有启动了service正在运行:    1)如果service的onStartCommnad()方法返回的是START_NOT_STICKY, 这时如果杀死进程, 进程就杀死了
android 后台service 不被杀死的几种方法
自己的app的service总是容易被系统回收,搜罗了一下,基本上的解决思路有以下几种:  1.把service写成系统服务,将不会被回收(未实践):  在Manifest.xml文件中设置persistent属性为true,则可使该服务免受out-of-memory killer的影响。但是这种做法一定要谨慎,系统服务太多将严重影响系统的整体运行效率。  2.提高service的优先级(未
处理Android应用在后台被杀死
一、背景         我们在使用android app的过程中,可能突然会遇到其他的事情需要将app退到后台,比如微信来了一条消息需要回复,当我们回复完消息在切换回我们的app时,如果处理不好,应用可能会白屏或者闪退。造成这种现象的原因,是android的进程回收机制,android会给每一个应用分配一定的内存,当应用退入后台时,系统并不会将应用杀死,而是将应用缓存起来。打开的应用越多,后台
关于APP进程被杀死,极光推送收不到消息的解决办法
如题,通过网上找来的大多数方法,试过对于三星A7100手机好像不起作用。如:在mainfest中给application设置这个属性android:persistent=&quot;true&quot;;在mainfest中去注册我们自定义的广播接收器,在onReceive里面开启推送的服务 Intent pushintent=new Intent(context,PushService.class);//启动极光推...
Android如何让Service不被轻易杀死
引言随着Android系统的更新,让服务长期运行在后台越来越困难,使我们可以免受流氓软件的困扰,真是可喜可贺。然而作为一个开发者,有时候也会面临这样一个问题,我们希望我们的服务可以尽可能长时间的在后台存活,然而我们的软件如果不是在ROM厂商的白名单中的话,一旦内存吃紧,被杀死几乎是必然的事情,接下来我们就来谈谈如何尽可能让我们的服务存活的时间长一些。1、提升service进程优先级Android将进
如何保证Service在后台不被杀死?
一、前期基础知识储备(1)为什么要保证后台Service不被杀死?提高应用存在感。对于大厂的应用来说,其程序“活着”不是问题,但是为了带来更好的用户体验,提高用户粘性,就需要尽可能调用程序更多的服务,这样才能带来更多的用户体验(不一定更好,但是数量占优);对于小家来说,尽可能的让程序“活着”是它们的第一要务,通过后台服务的方式让应用存活在用户手机里也是一种存活的方式。(2)后台Service真的可...
Android极光推送通知问题(如果你的app也想拥有qq,微信进程杀死后仍然可以收到推送,请看下面)
  「为什么微信或者 QQ 等应用看似可以保证不被杀死或者杀死后可以收到消息」 如果将他们完全彻底的杀死,也是收不到的,这是肯定的 只是:他们很难被杀死,即便杀死后也会以较快的速度重启:我们(用户)会下意识的在手机里开启对他们的保护;他们是不少手机系统的自带软件。 我们已接入「小米推送」、「华为推送」「魅族推送」「Google FCM」等市场上已有的 4 种系统...
使用Java让android手机自动执行重复重启
public static void main(String[] args)throws IOException,Exception { for(int j=0;j<10;j++) { Thread.currentThread().sleep(10000); Process process1 = Runtime.getRuntime().exec("adb
Android杀死正在运行的进程
最近有个需求,就是除自己app外杀死所有正在运行的进程。后来经过多番测试会发现无法实现。。。以下是我的测试过程: 记得刚开始学习时有一个killbackgroundprocess(packageName)的方法: ActivityManager actManager = (ActivityManager) context                 .getSystemService(C
Android中如何让Service不被一键清理且在息屏后保活
MarsDaemon库的使用及其出现的问题的解决 最近碰到这么一个需求,就是从服务器获取一个时间,每天在这个时间提醒用户,所以首先需要创建一个服务,让它能够长期运行在后台,且不被手机管理软件杀死,但是在Android5.0以后,什么守护进程啊等等方法都失效,后来在github上发现了一个据说可以让Service不死的库,支持到api23, https://github.com/Marswin/M
Android service 不被杀死“永不退出的服务”(双进程,服务,多进程,微信)
本文解析了微信的服务为什么不被杀掉,以及服务应该怎样设计才合理,制作一个不死的服务到底可能吗?,以及是否真的需要一个不死的服务。
【Android API指南】App组件(6) - Services
Service是一个执行长时间后台运行操作,并且不提供界面的程序组件。其他组件可以启动一个service,这个service会运行在后台,即使用户切换到了其他程序,service也不会停止。一个组件可以和service绑定来进行交互,甚至是进行进程间的通信(IPC)。例如,一个service可以处理网络连接,播放音乐,执行文件I/O,或者和一个content provider交互,这些都在后台运行
Android多进程重启app
对于一些需求,比如切换语言重启应用,如果项目中很多地方有通过Application.getResource().getString(int stringRes)在部分手机可能存在语言没有切换的问题,比较简单的能解决这个问题的方式是,杀死当前进程,重新启动app。具体实现:1、子进程服务/** * 跨进程重启,避免用Application获取的文案,切换语言后文案未更新问题 */ public ...
ADB命令杀死终端应用方法
前提:PC端装有adb(通过安装Android Studio,会自带adb软件) 1、需要在系统环境变量中配置adb路径(以便可以支持直接使用cmd窗口命令) 2、adb环境配置参考:https://blog.csdn.net/shengmer/article/details/79027828 此处以杀死PDM应用为例 3、进入设备:adb shell 4、查找PDM应用的PID:ps | gr...
安卓应用kill 自身并启动
安卓应用kill自身并启动 1.为了杀掉程序并重新启动,需要借助一个中间activity,并且该activity是另外一个进程,在该activity中调用killProcess杀掉原进程                     android:screenOrientation="portrait"                   android:process=":pid_
android利用广播和服务实现一个杀不死的流氓应用
1.创建一个android工程 2.创建两个service类OneService和TwoService 3.在MainActivity中开启两个service; Intent one = new Intent(this, OneService.class); startService(one); Intent two = new Intent(this, TwoService.class
Linux---关闭Elasticsearch进程,并重新启动
前言 有一种情况,当我们启动elasticsearch之后, 经过很长一段时间没有操作, 自己已经忘了是否已经启动了elasticsearch, 这时候我们可以通过下面的方式验证是否启动,并重新启动: step1 查找ES进程号 ps -ef | grep elastic 注意:下面的那个进程是当前这条命令的,不是真正的elasticsearch进程 step2 杀掉ES进程 ...
shell杀掉之前启动的jar工程,并重新启动该工程
备忘用,shell脚本
App手动杀死后重新打开App恢复杀死前的页面
说实话,刚接到这个需求的时候我内心是拒绝的。因为从用户角度来讲,我既然手动杀死了就是想关闭这个App,关闭的原因有很多,但是重启后还停留在我最后关闭时的页面就不可理解了。但是需求方是大佬,再不愿意也得做。下面说说思路及实现方式。1.功能思路     恢复关闭前的页面,是要恢复最后一个Activity的信息,还是恢复整个Activity栈的信息,经需求方要求是恢复所有打开的页面,也就是说恢复整个Ac...
让APP不被android系统杀掉
让APP不被android系统杀掉在AndroidManifest.xml中设置 ,可以提升权限,减小被系统kill的可能android:persistent=&quot;true&quot;
android 使用Service进行双进程守护,防止进程被杀
以下所用的方法只适用于防止app太久在后台太久而被系统杀死,在系统的一键清除功能下进程还是会被杀死的。 若要防止进程被系统的一键清除功能杀死,要设置允许当前app自启动。如何设置请看 跳转自启动管理页