基于Android 10.11 实现的Service服务保活

最近公司要实现app程序不被杀死 实现持续定位,在网上看了很多个文章 也看到双进程保活,我忘了在那看到这篇文章了

下面 具体显现

创建 MyService 集成 service 服务

public class MyService extends Service {private final static String TAG = MyService.class.getSimpleName();// 启动notification的id,两次启动应是同一个idprivate final static int NOTIFICATION_ID = android.os.Process.myPid();private AssistServiceConnection mServiceConnection;public MyService() {}@Overridepublic IBinder onBind(Intent intent) {return null;}public void onCreate() {super.onCreate();if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//数字是随便写的“40”,nm.createNotificationChannel(new NotificationChannel("40", "App Service", NotificationManager.IMPORTANCE_DEFAULT));NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "40");//其中的2,是也随便写的,正式项目也是随便写startForeground(2 ,builder.build());}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 测试线程,判断Service是否在工作new Thread(mRunnable).start();// 设置为前台进程,降低oom_adj,提高进程优先级,提高存活机率setForeground();return START_STICKY;}// 要注意的是android4.3之后Service.startForeground() 会强制弹出通知栏,解决办法是再// 启动一个service和推送共用一个通知栏,然后stop这个service使得通知栏消失。private void setForeground() {if (Build.VERSION.SDK_INT < 18){startForeground(NOTIFICATION_ID, getNotification());return;}if (mServiceConnection == null){mServiceConnection = new AssistServiceConnection();}// 绑定另外一条Service,目的是再启动一个通知,然后马上关闭。以达到通知栏没有相关通知// 的效果bindService(new Intent(this, AssistService.class), mServiceConnection,Service.BIND_AUTO_CREATE);}private class AssistServiceConnection implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Service assistService = ((AssistService.LocalBinder)service).getService();MyService.this.startForeground(NOTIFICATION_ID, getNotification());assistService.startForeground(NOTIFICATION_ID, getNotification());assistService.stopForeground(true);MyService.this.unbindService(mServiceConnection);mServiceConnection = null;}@Overridepublic void onServiceDisconnected(ComponentName name) {}}private Notification getNotification(){Intent intent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "").setContentTitle("服务运行于前台").setContentText("service被设为前台进程").setTicker("service正在后台运行...").setPriority(NotificationCompat.PRIORITY_MAX).setWhen(System.currentTimeMillis()).setDefaults(NotificationCompat.DEFAULT_ALL).setContentIntent(pendingIntent);Notification notification = builder.build();notification.flags = Notification.FLAG_AUTO_CANCEL;return notification;}Runnable mRunnable = new Runnable() {@Overridepublic void run() {while (true){Log.e(TAG+1111, "" + System.currentTimeMillis());发送广播Intent intent=new Intent();//指定广播的名字intent.setAction("com.yy.time.TIME_CHANGED_ACTION");//指定广播的内容// 此行  对8.0以上广播接受不到 增加处理 “包名” ,“广播地址” intent.setComponent( new ComponentName( "com.example.webwebsocket" ,"com.example.webwebsocket.Service.UITimeReceiver") );try {intent.setComponent( new ComponentName( "com.example.webwebsocket" ,"com.example.webwebsocket.Service.UITimeReceiver") );//此处我传递了值   你们不传递也行intent.putExtra("time",getTime());} catch (ParseException e) {e.printStackTrace();}//发送广播sendBroadcast(intent);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};@Overridepublic void onDestroy() {super.onDestroy();stopForeground(true);}}

再创建 AssistService 一个类也集成service服务

public class AssistService extends Service {public AssistService() {}public class LocalBinder extends Binder{public AssistService getService(){return AssistService.this;}}@Overridepublic IBinder onBind(Intent intent) {return new LocalBinder();}
}

在AndroidManifest.xml 清单文件里注册service服务   和一个广播

  <service android:name=".Service.MyService"></service>
<!--注册广播--><receiverandroid:name=".Service.UITimeReceiver"android:exported="false"><intent-filter><action android:name="com.yy.time.TIME_CHANGED_ACTION" /></intent-filter></receiver>

在创建一个广播接收器 利用广播传递消息

public class UITimeReceiver extends BroadcastReceiver {private  Context mContext;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if(MainActivity.TIME_CHANGED_ACTION.equals(action)){//此处处理你需要处理的逻辑 我写的接口回调  具体看个人需求}}
}
在MainActivity使用注册启动service 服务  此处做个Android版本判断 否则会出错
 //开启服务做兼容处理Intent intentOne = new Intent(this, MyService.class);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startForegroundService(intentOne);} else {startService(intentOne);}

完毕

我觉得直接复制就好  完成用不上demo  本人亲测 Android10 .11  oppo 小米机型 保活24小时   再往常的时间没试,大家可以试试 ,可以给楼主反馈。

Android Service服务保活相关推荐

  1. Android Service服务的相关介绍

    文章目录 Android Service服务的相关介绍 创建方式 启动方式 生命周期 onStartCommand参数及返回值的理解 ServiceConnection 场景说明 前台服务 问答 st ...

  2. android job service,服务保活那些事(Job Service ,JobScheduler)

    Android5.0以上保活 Android5.0之后,很多都是可以被APP杀死,尤其是某机型做服务保活更难.Android5.0之后Android提供了JobService和JobScheduler ...

  3. Android Service 服务(二)—— BroadcastReceiver

    一. BroadcastReceiver简介 BroadcastReceiver,用于异步接收广播Intent,广播Intent是通过调用Context.sendBroadcast()发送.Broad ...

  4. 【Android】Android Service 服务

    参考网址:http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Ac ...

  5. android开启服务应用禁止被杀死,Android Service服务如何不被杀死

    第一章 Service介绍 service服务是一个应用程序的四大组件之一,可以再后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切到另一个应用 ...

  6. Android Service 服务(一)—— Service

    一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...

  7. Android Service服务不被杀死(保活)

    1.设置->应用->运行中->停止->杀死service 这样可以在service的onDestroy()方法中重启service public void onDestroy( ...

  8. Android 锁屏后Service服务保活(支持9.0)

    最近遇到个问题: 后台Service启动正常启动后,锁屏状态下大概80秒左右Service就被暂停了(并没有被杀死),唤醒屏幕后就继续执行. 解决方法: Service启动时创建一条通知,与其绑定,这 ...

  9. Android 自用 App保活——音乐播放保活适配8.0 (贼好用)

    又是好久没有积累东西了.惭愧,惭愧...手动哭泣.闲话说到这里,下面我介绍一种新的 App 保活方式哈,目前用小米家族手机 涵盖 Android 5.0 到 Android 8.1家族的测试.结论是, ...

最新文章

  1. python3 import 和__import__() 的区别
  2. 轻松得到C# ADO.NET的各种数据库连接字符串
  3. Linux下shell脚本之双色球摇号脚本
  4. 简要描述cookie和session的区别:
  5. Day 11: AeroGear 推送服务器:使应用的通知推送变得简单
  6. go-ipfs-api在项目中的使用
  7. thinkphp mysql类_PHP封装类似thinkphp连贯操作数据库的Db类(简单版)
  8. nginx 目录讲解
  9. lede更改软件源_Linux的上传和下载——Ubuntu中软件的安装和ftp服务器的搭建
  10. Nginx 备战-优化指南
  11. JS制作常见通知信息(适用于手机通知信息和电脑通知信息)
  12. 关于spring MVC中加载多个validator的方法。
  13. matlab中的控制语句,MATLAB控制语句
  14. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议
  15. 使用CAS代替synchronized
  16. python list sort by,python中List的sort方法指南
  17. Verilog hdl 宏定义编译报错
  18. 精通JavaScript事件.详解
  19. jQuery判断浏览器是移动端还是电脑端自动跳转
  20. CF1041D Glider

热门文章

  1. 【python】PPT转PDF(同一目录下批量)
  2. 【020】基于51单片机智能路灯系统Proteus仿真与实物设计
  3. word不能读出html表格,Word表格不能输入文字的几种情况
  4. 常山股份搬家可实现销售65亿元,利税14亿元
  5. 第3课 Altium Designer20(AD20)+VESC6.4实战教程:新建工程(北冥有鱼)
  6. Android之实现QQ好友分组(ExpandableListView)
  7. 机器视觉-相机镜头光源介绍及选型-8.镜头选型
  8. 《设计模式》——里氏替换原则
  9. 拼多多怎么用有效评价做爆款,提高销量排名?
  10. 初学者关于ztree的浅谈