Android Service服务保活
基于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服务保活相关推荐
- Android Service服务的相关介绍
文章目录 Android Service服务的相关介绍 创建方式 启动方式 生命周期 onStartCommand参数及返回值的理解 ServiceConnection 场景说明 前台服务 问答 st ...
- android job service,服务保活那些事(Job Service ,JobScheduler)
Android5.0以上保活 Android5.0之后,很多都是可以被APP杀死,尤其是某机型做服务保活更难.Android5.0之后Android提供了JobService和JobScheduler ...
- Android Service 服务(二)—— BroadcastReceiver
一. BroadcastReceiver简介 BroadcastReceiver,用于异步接收广播Intent,广播Intent是通过调用Context.sendBroadcast()发送.Broad ...
- 【Android】Android Service 服务
参考网址:http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Ac ...
- android开启服务应用禁止被杀死,Android Service服务如何不被杀死
第一章 Service介绍 service服务是一个应用程序的四大组件之一,可以再后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切到另一个应用 ...
- Android Service 服务(一)—— Service
一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...
- Android Service服务不被杀死(保活)
1.设置->应用->运行中->停止->杀死service 这样可以在service的onDestroy()方法中重启service public void onDestroy( ...
- Android 锁屏后Service服务保活(支持9.0)
最近遇到个问题: 后台Service启动正常启动后,锁屏状态下大概80秒左右Service就被暂停了(并没有被杀死),唤醒屏幕后就继续执行. 解决方法: Service启动时创建一条通知,与其绑定,这 ...
- Android 自用 App保活——音乐播放保活适配8.0 (贼好用)
又是好久没有积累东西了.惭愧,惭愧...手动哭泣.闲话说到这里,下面我介绍一种新的 App 保活方式哈,目前用小米家族手机 涵盖 Android 5.0 到 Android 8.1家族的测试.结论是, ...
最新文章
- python3 import 和__import__() 的区别
- 轻松得到C# ADO.NET的各种数据库连接字符串
- Linux下shell脚本之双色球摇号脚本
- 简要描述cookie和session的区别:
- Day 11: AeroGear 推送服务器:使应用的通知推送变得简单
- go-ipfs-api在项目中的使用
- thinkphp mysql类_PHP封装类似thinkphp连贯操作数据库的Db类(简单版)
- nginx 目录讲解
- lede更改软件源_Linux的上传和下载——Ubuntu中软件的安装和ftp服务器的搭建
- Nginx 备战-优化指南
- JS制作常见通知信息(适用于手机通知信息和电脑通知信息)
- 关于spring MVC中加载多个validator的方法。
- matlab中的控制语句,MATLAB控制语句
- 吴恩达《机器学习》学习笔记十一——应用机器学习的建议
- 使用CAS代替synchronized
- python list sort by,python中List的sort方法指南
- Verilog hdl 宏定义编译报错
- 精通JavaScript事件.详解
- jQuery判断浏览器是移动端还是电脑端自动跳转
- CF1041D Glider
热门文章
- 【python】PPT转PDF(同一目录下批量)
- 【020】基于51单片机智能路灯系统Proteus仿真与实物设计
- word不能读出html表格,Word表格不能输入文字的几种情况
- 常山股份搬家可实现销售65亿元,利税14亿元
- 第3课 Altium Designer20(AD20)+VESC6.4实战教程:新建工程(北冥有鱼)
- Android之实现QQ好友分组(ExpandableListView)
- 机器视觉-相机镜头光源介绍及选型-8.镜头选型
- 《设计模式》——里氏替换原则
- 拼多多怎么用有效评价做爆款,提高销量排名?
- 初学者关于ztree的浅谈