Android 后台服务保活
推广一下我的个人博客小站:
Z同学 期待大家的围观
需求
1.在华为手机中应用切换到后台后,打开其他app。需要我的应用后台仍然能够访问http,传输数据。
2.息屏后服务没有退出的话,需要继续后台运行,并进行网络数据的传输和请求
方案
1.添加应用到白名单中。代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
String pn= getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(pn)) {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + pn));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_CODE);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "用户不允许程序后台运行~", Toast.LENGTH_LONG).show();
}
}
}
这个方案是将项目添加到系统白名单中,实现不进行电池优化,解决后台运行的问题。
结果:失败,在vivo手机低版本中能够通过,但是华为就不行了
2.创建前台服务,startForegroundService()来允许服务后台一直运行。
结果:失败,服务是存活了,切换到后台后,也不会被清理,通过状态栏上可以看到Notification的存活。
但是线程被停止了,网络请求被关闭了。整个Service被系统执行了暂停。
解决方案:
参考了音乐播放器,实现了长时间常驻和回收问题。
1.创建startForegroundService()服务,启动一个前台服务,这个只是告诉你启动服务,而不代表你的服务一直是前台服务。
2.在service中创建线程,循环执行notification的刷新。你可以不改变notification的信息,执行statForeground()方法。不断的刷新
系统会将你的应用判断为正在与桌面activity进行交互的进程。从而保证你的service的存活,你的所有网络请求和后台操作都会存活。(实测有效)
3.如果不喜欢notification 可以尝试浮动框。也是在service中调用线程循环刷新浮动框(未实测,但预估有效)
上面的方法能够实现应用被切换到后台后,也一直在运行。
最后一步,
创建一个普通的Service,在你的应用启动的时候创建它,应用退出的时候销毁它。
在service中监听亮屏和息屏操作
IntentFilter screenStatusIF = new IntentFilter();
screenStatusIF.addAction(Intent.ACTION_SCREEN_ON);
screenStatusIF.addAction(Intent.ACTION_SCREEN_OFF);
// 注册
registerReceiver(receiver, screenStatusIF);
然后在监听亮屏和息屏的时候 直接进行音视频的播放。
播放无声音音频文档。进行循环不断的播放。
自测可以和网易云音乐同样处于后台播放模式,服务都能一直稳定并进行发送网络。
由于项目原因就不提供代码了。代码比较简单 ,主要是想法和思路。
上面的方案执行后自测华为荣耀v10锁屏后运行30分钟,没有问题。
不用客户主动在电池权限中开启后台运行。就能保证服务稳定。
注意:如果非得追求客户无感的模式下,进行后台服务常驻,那应该算是非常流氓的行为了。或者你的app有微信的那么大的脸,让厂家将你的app添加到厂商版后台运行白名单。
否则给客户一个任务栏又有何妨。百度,网易云音乐等应用都是通过类似方式来实现后台运行。