service保活那些坑

博主在安卓智能电视上做悬浮标签时,遇到service在后台易被杀的问题。尝试设置优先级、提升为前台进程等多种方式均无效,最终找到一种可在系统杀死服务时拉起,且能手动控制开关的API,详情可参考相关链接。

最近在做一个悬浮标签,应用到安卓智能电视上,遇到了service在后台容易被杀的情况,网上各种查,各种尝试,各种方式,都试过了,都不好使,比如:
1,设置优先级。
2,提升为前台进程(电视上无效)
3,添加到系统白名单(白名单加上,还是不好使)
4,persistent属性(这个没试,因为这个设置生效的前提条件是必须是预装应用,放在system/app下的,不然无效)
5,alarmmanager,这个是手动kill的情况下,能拉起来,但是被系统kill的时候,拉不起来
最后终于找到一种可以在被系统杀死的情况下,拉起服务的api,而且可以手动控制开关,非常好用,详情参考:
https://blog.youkuaiyun.com/u014159143/article/details/76268364

### 关于Android Service的最佳实践 #### 前置条件与背景 在现代Android开发中,应用的后台存能力是一个重要话题。尽管Google通过引入前台服务和其他机制试图限制过度占用资源的应用程序行为,开发者仍然可以通过一些技术手段提高应用程序的存率。需要注意的是,这些方法可能因不同厂商定制系统的差异而表现各异。 --- #### 权限声明与基础配置 为了实现Service功能,首先需要在`AndroidManifest.xml`文件中正确声明必要的权限和服务组件: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <service android:name=".MyJobDaemonService" android:enabled="true" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" /> ``` 以上代码片段展示了如何定义一个可绑定的服务,并赋予其必要权限[^2]。 --- #### 使用前台服务延长生命周期 前台服务是一种有效的持应用跃的方法。它允许应用显示通知栏消息,从而告知用户当前正在进行的任务。虽然这种方法并不能完全阻止被杀死的可能性,但在大多数情况下能够显著提升服务的优先级。 启动前台服务的关键在于调用`startForeground()`方法,并提供相应的Notification对象: ```java public class MyForegroundService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { Notification notification = new NotificationCompat.Builder(this, "CHANNEL_ID") .setContentTitle("Running in Background") .setContentText("This is a foreground service.") .setSmallIcon(R.drawable.ic_notification) .build(); startForeground(1, notification); // 启动前台服务 return START_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 此代码实现了基本的前台服务逻辑,确即使系统内存不足时也能维持较高的存概率[^1]。 --- #### 利用JobScheduler增强稳定性 除了传统的Service外,还可以借助`JobScheduler` API来安排周期性的任务执行。这种方式特别适合那些不需要实时响应但希望长期运行的操作。 创建自定义的`JobService`类如下所示: ```java public class MyJobService extends JobService { @Override public boolean onStartJob(JobParameters params) { // 开始处理工作 performWork(); jobFinished(params, false); return true; } private void performWork() { Log.d("JOB_SCHEDULER", "Executing background task..."); } @Override public boolean onStopJob(JobParameters params) { return false; // 不重新调度该作业 } } ``` 随后可以在适当位置注册这个任务计划器实例: ```java ComponentName componentName = new ComponentName(context, MyJobService.class); JobInfo jobInfo = new JobInfo.Builder(JOB_ID, componentName) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) .setPeriodic(TimeUnit.HOURS.toMillis(1)) .build(); JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); scheduler.schedule(jobInfo); ``` 利用上述方式可以有效减少因系统清理而导致的服务中断风险[^2]。 --- #### 处理极端情况下的进程恢复 考虑到部分手机制造商实施了额外的安全措施(如强制关闭长时间未使用的后台进程),单纯依赖单一解决方案往往难以奏效。此时可通过以下几种补充策略进一步巩固效果: 1. **多进程架构设计** 将核心业务拆分至独立进程中运行,即便主界面所在的UI线程遭到销毁也不会影响其他模块正常运作[^3]。 2. **广播接收器监听事件** 注册特定类型的BroadcastReceiver以便及时感知环境变化并作出反应。例如开机完成后自动重启指定组件等功能均能借此达成。 3. **本地守护进程配合远程唤醒机制** 结合JNI层面上的技术构建跨平台兼容性强的新实体监控目标状态;一旦发现异常即刻触发重连流程完成自我修复动作[^4]。 --- ### 技术局限性说明 值得注意的一点是,任何企图绕过官方框架设定的行为都存在违反政策的风险。随着版本迭代推进以及监管力度加大,未来此类技巧可能会面临更多阻碍甚至失效局面。因此建议仅当确实有必要才考虑采用类似做法,同时密切关注最新动态调整部署方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值