当前位置:首页 » 安卓系统 » android不死service

android不死service

发布时间: 2025-10-20 05:22:33

❶ ios系统和Android区别

1、两者运行机制不同:IOS采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。

2、两者后台制度不同:IOS中任何第三方程序都不能在后台运行;安卓中任何程序都能在后台运行,直到没有内存才会关闭。

3、IOS中用于UI指令权限最高,安卓中数据处理指令权限最高。

(1)android不死service扩展阅读

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。

2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。

❷ 如何让一个应用程序一直在后台运行

1、保活手段

1 业界保活手段:黑色保活,灰色保活,白色保活

2 黑色保活:

1 不同的APP进程,用广播相互唤醒,包括利用系统广播进行唤醒

2 常见手段:

1 开机,网络切换,拍照,拍视频等利用系统广播唤醒APP

此场景Google已经意识到,在Android N 取消了 拍照,视频,网络切换的广播

2 接入第三方的SDK也会唤醒相应的APP进程

3 假如你手机里装了支付宝,淘宝,UC等阿里系的APP,那么你打开任何一个,都有可能唤醒其他的阿里系的APP

3 白色保活:

就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行

4 灰色保活

1 保活领域应用最为广泛,利用系统的漏洞来启动一个前台的Service进程,与“白色保活”不同的是,它不会在通知栏生成一个Notification,用户无法察觉,但是优先级要高于普通的后台进程。

2 实现思路

思路一:当API<18,启动前台的Service直接传入new Notification();

思路二:当API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理
代码这样写:

[java]view plain

  • importandroid.app.Notification;

  • importandroid.app.Service;

  • importandroid.content.Intent;

  • importandroid.os.Build;

  • importandroid.os.IBinder;

  • /**

  • *APP灰色保活

  • *Createdbyfflinon2016/4/23.

  • */

  • {

  • privatefinalstaticintGRAY_SERVICE_ID=1001;

  • @Override

  • publicIBinderonBind(Intentintent){

  • returnnull;

  • }

  • @Override

  • publicintonStartCommand(Intentintent,intflags,intstartId){

  • //API<18,此方法能有效地隐藏notification的图标

  • if(Build.VERSION.SDK_INT<18){

  • startForeground(GRAY_SERVICE_ID,newNotification());

  • }else{

  • Intentintent1=newIntent(this,GrayInnerService.class);

  • startService(intent1);

  • startForeground(GRAY_SERVICE_ID,newNotification());

  • }

  • returnsuper.onStartCommand(intent,flags,startId);

  • }

  • //给API>=18的平台上做灰色保护手段

  • {

  • @Override

  • publicIBinderonBind(Intentintent){

  • returnnull;

  • }

  • @Override

  • publicintonStartCommand(Intentintent,intflags,intstartId){

  • startForeground(GRAY_SERVICE_ID,newNotification());

  • stopForeground(true);

  • stopSelf();

  • returnsuper.onStartCommand(intent,flags,startId);

  • }

  • }

  • }



  • 3 检验方法:

    首先看系统通知栏有没有Notification,如果没有,就进入手机adb shell模式,输入命令mpsys activity services PackageName

    打印出指定包名的所有进程中的service信息,看下有没有isForground=true的信息,如果有,就说明了该APP使用了灰色保活

    4 使用灰色保活手段并不意味着你的应用就能永生不死,只能说提高了进程的优先级,如果应用占用了很大的内存,还是会被回收的

    2、进一步理解保活

    1 进程回收机制

    系统出于体验和性能上的考虑,APP在退出后台时系统并不会真正的kill掉这个进程,而是将其缓存起来,打开的应用越多,后台缓存的进程也就越多。在系统内存不足的情况下,系统开始根据自身的一套进程回收机制来判断要回收掉哪些进程,这套杀死进程回收内存的机制叫 Low Memory Killer,它是基于Linux内核的OOM killer机制诞生的,该机制为每个系统分配了一个值,叫做oom_adj,代表了进程的优先级,oom_adj越大,代表优先级越低,越容易被回收,普通APP进程的oom_adj >=0,系统的可能会小于0.

    2 查看oom_adj的值,需要用到两个shell命令

    ps | grep 包名

    $cat /proc/进程id/oom_adj

    3 结果发现,APP推到后台,UI进程的值降低最为明显,因为它占用的内存资源最多,因此,为了避免后台UI进程被杀,需要尽可能的释放一些不用的图片,音频资源

❸ 进程保活

一 、问:什么是进程保活?

答:进程保活就是进程永远存在内存中,是杀不死的,就算杀死了也会有办法重新启动起来,其实这些并不是流氓手段,很多情况下,如果你想给你的用户提供服务,就必须有一个进程常驻着,便于在特定的时候做一些特定的事情,比如广播接受者,他就不支持静态注册,也就是说如果我们想接受屏幕开关启动的广播,必须要在进程中动态注册,这个时候如果没有一个常驻的进程,锁屏业务就无法正常的为用户展开服务。

二、问:进程是怎么死掉的呢?

答:其实进程被杀死的原因,一方面是人为的,二、可能被第三方应用杀死,如杀敌软件等。

三、问:Android进程的优先级?

答:

  1、前台进程 (Foreground process):用户当前操作所在的进程,当内存不足以承担前台进程的使用,才有可能回收

  2、可见进程(Visible process):没有任何前台组件,但是仍然会影响屏幕上所见内容,他是一种极为重要的进程,除非为了维持前台进程,因内存不足,有可能会回收掉可见进程,否则系统是不会回收可见进程。

  3、服务进程(Service process):他与用户所见的内容是没有直接关联,但是他们通常执行一些用户关心的操作,比如说在后台获取网络数据,后台播放音乐,后台进行一些数据计算等。被杀死的原因:也是为了

  支持前台进程和可见进程,因内存不足情况下才会被回收。

  4、后台进程(BaclGround process):对用户的体验没有直接的影响,用户可以随时终止他们,这个进程是为了供给上面三个进程来使用的,通常在后台进程运行着很多操作,他们保存在一个列表当中,为了确保用户最近查看Activit的进程最后一个被终止,他是一个LRU算法

  5、空进程(Empty process) :保存这个进程的唯一目的就是用来做缓存,以缩短下次在运行组件所需的启动时间,为了使系统总体的资源在进程缓存和内存底层之间保持平衡。它是不包括任何组件的进程.

四、问:Android进程的回收策略?

答:Android进程的回收策略主要是通过Low memory killer机制来完成的。

  Low memory killer:通过一些比较复杂的评分机制,对进程进行打分,然后讲分数的进程判定为bad进程,杀死并释放内存。Low memory killer是定时进行检查的,它主要是通过进程的OOM_ODJ来判断进程的优先级。当OOM_ODJ的值越小,进程的优先级越高,而OOM_ODJ越不会去回收。反之就会被回收。

  注意:Low memory killer和out memory不一样的地方:out memory机制只有当系统内存不足的时候才会启动检查,而Low memory killer是定时进行检查的,它主要是通过进程的OOM_ODJ来判断进程的优先级。

五、问:进程保活方案?

答:Android进程的回收策略主要是通过Low memory killer机制来完成的。

  1、利用系统广播拉活,在发生系统事件的时候,系统会发出相应的广播,

    详情查看:http://blog.csdn.NET/sunshinetan/article/details/53126857

  2、利用系统Service机制拉活,在Service有一个onStartCommand

    推荐博客:http://blog.csdn.net/wulianghuan/article/details/8596467

    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。从Android官方文档中,我们知道onStartCommand有4种返回值:

    START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand

    (Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。(service因内存不足的情况下,杀死的进程才可以拉活,这里要特别注意,不是所有情况都可以拉活。第一次server被杀死后,会在5秒后拉活,第二次会在10秒后,第三次会在20秒后。之后就不会在拉活。第二种情况是获得root权限通过stop停止的,也是无法通过server拉活)

    START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被用;。

    START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

    START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

  3、利用Native进程拉活,

  4、利用JobScheler机制拉活:Android5.0之后提供的一个机制,他会监听主进程的存活,如果死掉就会激活拉活进程。

  5、利用账号同步机制拉活:android系统有一个账户系统,设置一个自己的账户,android会定期唤醒账户更新服务。我们可以自己设定同步的事件间隔,且发起更新的是系统,不会受到任何限制。需要在 AndroidManifest 中定义账号授权与同步服务。

    Android 版本(Android N)中系统对账户同步这里做了变动,该方法不再有效。

    缺点:

          a.用户会在系统设置的账户列表里面看到一个不认识的账户;

          b.同步的事件间隔是有限制的,最短1分钟,见源码,如果小雨60秒,置为60秒;

          c.用户可以卸载账户;

          d.必须联网!google提供这个组件是让你同步账户信息,不联网就不能保活!

❹ 关于APP进程被杀死,极光推送收不到消息的解决办法

推送是每一个APP必不可少的一部分,这几天正好在做这一块,所以总结一下遇到的一些问题。在APP被杀死的情况下,对应的推送service也一起被杀死了,这个时候我们怎么能够收到后台的推送呢?
解决办法很简单,但是也特别粗暴,在mainfest中给application设置这个属性android:persistent="true",看意思我们就知道,持续的,一直的,这样的话,app是杀不死的,推送肯定有可以收到了。但是强烈建议不要这样做,因为这样就像某些流氓软件一样了,毕竟我们做个应用出来,也不想让别人以为我们的是流氓软件吧。好了,重头戏来了,最后一种方法,也是我比较推荐的一种。用Broadcast Receivers。我们都知道,推送实际上应用的就是广播,这里我们自定义一个广播接收器,让它继承系统的Broadcast Receivers,然后复写它的onReceive方法,在onReceive里面开启推送的服务。最后在mainfest中去注册我们自定义的广播接收器。这里一定要用静态注册的广播接收器。如果是动态注册的,APP被杀死后,广播接收器也会被杀死。下面我已极光推送为例。

热点内容
制作脚本网站 发布:2025-10-20 08:17:34 浏览:819
python中的init方法 发布:2025-10-20 08:17:33 浏览:522
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:705
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:625
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:938
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:195
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:55
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:748
python股票数据获取 发布:2025-10-20 07:39:44 浏览:652
如何查看数据库的版本 发布:2025-10-20 07:29:12 浏览:689