首页 > 系统相关 >android守护进程

android守护进程

时间:2022-11-29 15:00:46浏览次数:35  
标签:Service service 广播 Intent 注册 进程 android 守护


Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持,就会被其杀掉。

在早些时候,我们可以通过在


1. service中重写onStartCommand方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动

public int onStartCommand(Intent intent, int flags, int startId) {        

   return START_STICKY;    

}




2. 配置android:persistent="true" 




3. setForeground(true); 




4. android:process=”com.xxx.xxxservice”配置到单独的进程中




以上的方法要么只是提升service优先级或者存活率, 并不能解决被安全软件强行杀死的问题.

要么像第四种单独的进程运行service在360老的版本是可以的,但是在360的比较新的版本中仍然会被杀死.




如何保持Service的运行状态是现在要说明的,核心就是利用ANDROID的系统广播,触发自己的程序检查Service的运行状态,如果被杀掉,就再起来。




常用的有开机广播,解锁屏幕的广播,电量变化等等, 其中解屏的广播算比较频繁的了,但是也并不能保证一定的频率,尤其是在特定的时间里(比如用户睡觉的时候,用户并不进行解锁操作).而我们仍要做一些操作的时候,就没有办法了.


因此,我采用了一种别的方案. 另外再加上两个类似一守护进程的Service, 分别检查Service的运行状态,注册响应的广播,对其进行守护,一旦发现没有运行就将其启动.






我利用的系统广播是




Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。




它的优点就是间隔时间短而且非常稳定, 而其他的广播并不能保证这一点,当然,在具体的应用中还是要根据需求使用, 结合其他广播来保证自己的service一定会被重启.



毕竟现在安全软件是越来越厉害了,更新得也是非常频繁. 有时间还是要看下还有没有其他的方法,综合几种来使用.


下边就是具体的代码和注意事项了:




1、 Intent.ACTION_TIME_TICK的使用




我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过




registerReceiver()方法注册。




在ThisApp extends Application 或者在service里注册广播:


   


[java]  ​​view plain​​ ​​c​​



  1. IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK);   
  2.       
  3. new MyBroadcastReceiver();   
  4.     registerReceiver(receiver, filter);   



在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里


    


[java]  ​​view plain​​ ​​co​​



  1.  boolean isServiceRunning = false;   
  2.   
  3.   
  4. if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) {   
  5.         
  6. //检查Service状态   
  7.         
  8.     ActivityManager manager = (ActivityManager)AppApplication.getContext().getSystemService(Context.ACTIVITY_SERVICE);   
  9. for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) {   
  10. if("so.xxxx.xxxxService".equals(service.service.getClassName()))   
  11.             
  12.      {   
  13. true;   
  14.     }   
  15.         
  16.      }   
  17. if (!isServiceRunning) {   
  18. new Intent(context, xxxService.class);   
  19.            context.startService(i);   
  20.     }   
  21.   
  22.   
  23. }   


终极解决方案: 使用Kni,在 c端 fork进程,检测Service是否存活,若Service已被杀死,则进行重启Service.   至于检测方式,可以轮询获取子进程Pid,若为1, 则说明子进程被Init进程所领养,已经成为了孤儿进程.    但是这种方式比较消耗电量,并且由于不同手机系统定制的改变,当应用被强制停止时,父进程并不一定被真正杀死,因此在一些特定机型上是无法通过此方式进行判断. 这里推荐使用liunx socket的方式进行类似心跳包的检测,并且当触发检测Service是否被杀死之前,需要判断应用是否已经被卸载,如果应用已经被卸载,则不再进行检测Service行为,直接调用exit(0)退出子进程,避免浪费系统资源和消耗电量.

标签:Service,service,广播,Intent,注册,进程,android,守护
From: https://blog.51cto.com/u_13657808/5895129

相关文章

  • python,进程线程
    一、什么是进程/线程https://blog.csdn.net/qq_69447411/article/details/1263134261、引论众所周知,CPU是计算机的核心,它承担了所有的计算任务。而操作系统是计算机......
  • android上拉下拉加载更多数据
    效果图下拉刷新:加载更多:CustomListView.java[java]​​viewplain​​​​copy​​package  importimportimportimportimportimportimportimportimporti......
  • android多屏幕分辨率适配
    首先要介绍一下drawable-mdpi、drawable-hdpi-1280x800、drawable-hdpi。这个相信好好看一下也明白。就是代表着分辨率320X480、1280X800、480X800三款屏幕图片资源包。其......
  • android 之ndk开发
    1、AndroidNDK简介NDK全称为nativedevelopmentkit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(softwaredevelopmentkit)软件开发包(只支持java语言开发)。简单......
  • android之service
    android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐,或者记......
  • android代码混淆
    proguard原理Java代码编译成二进制class文件,这个class文件也可以反编译成源代码,除了注释外,原来的code基本都可以看到。为了防止重要code被泄......
  • ShareSDK Android端权限说明
    ShareSDK使用权限情况权限权限说明是否必须INTERNET允许应用程序联网必须ACCESS_NETWORK_STATE允许访问网络状态必须READ_PHONE_STATE读取设备标识非必须WRITE_EXTERNAL_STO......
  • 图解Linux进程间通信实现原理(1)
    为Linux应用程序的开发人员,对Linux的进程间通信方式肯定是了如指掌,平时的开发中应该会大量的使用到。当你迅速的在键盘上按下【CTRL+C】终止掉一个正在运行中的命令时,你有没......
  • 史上最全的android学习资料
    一、开发环境搭建(已完成)负责人:kris状态:已完成所整理标签为:搭建SDKJDKNDKEclipseADT模拟器AVD调试器(DEBUG)DDMS测试日志LogcatA......
  • android的RadioGroup讲解
    这个主要是如何替换fragment的demo。效果图如下(下面的tabhost和上面的bar不属于这次的内容,这个是我做的一个应用程序框架的一部分,有需要的或者想研究研究的可以私下联系),主要......