Android app后台运行可行方案

  • 需求由来
  • 方案
  • 代码实现

需求由来

最近一个项目由于特殊原因,好几个不懂技术的人来当甲方,人人都是产品经理,没有项目经理,功能和实现细节要自己想自己定,再加上个比较无语的**(代码逻辑和实现方案让你吃惊),具体就不吐槽了。把自己得事情做好,把心态放平稳些。

我的印象里让应用后台保持运行这个功能一直都被提过。。。这个功能真的让人心烦,也让用户心烦,反正我得手机上如果我发现有这样得没有必要得应用,我都会干掉他。

方案

应用后台保活,后台运行,长时间后台任务这些说法,目前我接触到最靠谱得还是通过系统提供的方式,那些启动各种服务等等的都不行;如果要是设备上的系统应用的话(使用mtk或者其他厂商的原生android系统),那只通过启动服务,广播这些就可以帮你完成大部分需求,适量添加接下来的功能;如果要是安装到手机的普通应用的话,还是需要系统和厂家提供的方式最靠谱,但也有一些弊端,需要引导用户去设置。

代码实现

1: 忽略电池优化:
有些手机设置这一项就可以达到系统不清理当前应用的效果,例如我这个三星测试机;调用后会有系统的弹窗,api在23及以上,提供查询api和弹窗设置;代码如下
// 权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />// 查询是否允许
@RequiresApi(api = Build.VERSION_CODES.M)
fun isIgnoringBatteryOptimizations(context: Context): Boolean {var isIgnoring = falseval powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager?if (powerManager != null) {isIgnoring = powerManager.isIgnoringBatteryOptimizations(context.packageName)}return isIgnoring
}// 通过系统弹窗让用户设置
@RequiresApi(api = Build.VERSION_CODES.M)
fun requestIgnoreBatteryOptimizations(context: Context) {try {val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)intent.data = Uri.parse("package:" + context.packageName)context.startActivity(intent)  // 此处如需要回调的话那就使用另一种方式开启} catch (e: java.lang.Exception) {e.printStackTrace()}
}
2:通过各自手机厂商的系统应用去管理当前应用可后台运行;引导用户去设置时需要提示用户如何操作,不管是弹窗也好,开启页面图文说明也好总是是要提示用户的;我这里就简单通过弹窗来提示操作;我分为两部分,前部分为统一的,就是为啥需要开启这些,给用户说明一下;另一部分就是针对不同厂家的手机做不同的提示说明了。如下代码
/**
* 相关的描述看里面注释,自己照着可以做适当修改
*/
fun getDesc(context: Context): String {// 这个描述简单说明下为什么需要开启这些设置;后面再加个换行符val baseDesc = context.resources.getString(R.string.permissionsutil_getdesc_desc_top)if (RomUtils.isHuawei()) {//关闭应用的自动管理,设置允许后台活动和自启动return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_huawei)} else if (RomUtils.isXiaomi()) {//授权管理 -> 自启动管理 -> 允许应用自启动和后台活动return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_xiaomi)} else if (RomUtils.isOppo()) {//授权管理 -> 自启动管理 -> 允许应用自启动和后台活动return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_oppo)} else if (RomUtils.isVivo()) {//权限管理 -> 自启动 -> 允许应用自启动和后台活动return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_vivo)} else if (RomUtils.isMeizu()) {//权限管理 -> 后台管理 -> 允许应用后台运行return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_meizu)} else if (RomUtils.isSamsung()) {//自动运行应用程序 -> 打开应用开关;设置应用可后台运行相关选项return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_samsung)} else if (RomUtils.isLeeco()) {//自启动管理 -> 允许应用自启动return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_leeco)} else if (RomUtils.isSmartisan()) {//权限管理 -> 自启动权限管理;设置应用可后台运行相关选项return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_smartisan)} else {return baseDesc}
}

在弹窗里引导用户去设置后代码如下:

fun showActivity(context: Context, packageName: String) {val launchIntentForPackage = context.packageManager.getLaunchIntentForPackage(packageName)context.startActivity(launchIntentForPackage)
}fun showActivity(context: Context, packageName: String, activityDir: String) {val intent = Intent().apply {component = ComponentName(packageName, activityDir)addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)}context.startActivity(intent)
}fun showActivityForMeizu(context: Context){val intent = Intent()val unflattenFromString = ComponentName.unflattenFromString("com.meizu.safe.permission.PermissionMainActivity")intent.setComponent(unflattenFromString)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)context.startActivity(intent)
}fun showDetailActivity(context: Context){val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {setData(Uri.fromParts("package",context.packageName,null))}context.startActivity(intent)
}

下面代码里有很多打印和异常处理,根据自己需要修改,可以试试自己的测试机跳的页面对不对,如果不对通过adb找对应的路径。 做下异常处理 下面的代码有些机型没有测试,最后出异常直接跳到应用详情里去

fun checkBackgroundPermission(context: Context) {if (isHuawei()) { // 应用启动管理 -> 关闭应用开关 -> 打开允许自启动LogUtil.e("checkBackgroundPermission", "isHuawei")try {showActivity(context,"com.huawei.systemmanager","com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isHuawei e: " + e.message)try {showActivity(context,"com.huawei.systemmanager","com.huawei.systemmanager.optimize.bootstart.BootStartActivity")} catch (e: Exception) {showDetailActivity(context)}}} else if (isXiaomi()) { // 授权管理 -> 自启动管理 -> 允许应用自启动LogUtil.e("checkBackgroundPermission", "isXiaomi")try {showActivity(context,"com.miui.securitycenter","com.miui.permcenter.autostart.AutoStartManagementActivity")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isXiaomi e: " + e.message)showDetailActivity(context)}} else if (isOppo()) { // 权限隐私 -> 自启动管理 -> 允许应用自启动LogUtil.e("checkBackgroundPermission", "isOppo")try {showActivity(context, "com.coloros.phonemanager")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isOppo e: " + e.message)try {showActivity(context, "com.coloros.oppoguardelf")} catch (e: Exception) {try {showActivity(context, "com.coloros.safecenter")} catch (e: Exception) {showDetailActivity(context)}}}} else if (isVivo()) { // 权限管理 -> 自启动 -> 允许应用自启动try {if (Build.VERSION.SDK_INT >= 26) {showActivity(context, "com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.PurviewTabActivity")} else {showActivity(context, "com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.SoftwareManagerActivity")}} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isVivo e: " + e.message)try {showActivity(context, "com.iqoo.secure")} catch (e: Exception) {showDetailActivity(context)}}} else if (isMeizu()) { // 权限管理 -> 后台管理 -> 点击应用 -> 允许后台运行LogUtil.e("checkBackgroundPermission", "isMeizu")try {showActivity(context, "com.meizu.safe")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isMeizu e: " + e.message)try {showActivityForMeizu(context)} catch (e: Exception) {showDetailActivity(context)}}} else if (isSamsung()) { // 自动运行应用程序 -> 打开应用开关 -> 电池管理 -> 未监视的应用程序 -> 添加应用LogUtil.e("checkBackgroundPermission", "isSamsung")try {showActivity(context, "com.samsung.android.sm_cn")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isSamsung e: " + e.message)try {showActivity(context, "com.samsung.android.sm")} catch (e: Exception) {showDetailActivity(context)}}} else if (isLeeco()) { // 自启动管理 -> 允许应用自启动LogUtil.e("checkBackgroundPermission", "isLeeco")try {showActivity(context,"com.letv.android.letvsafe","com.letv.android.letvsafe.AutobootManageActivity")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isLeeco e: " + e.message)showDetailActivity(context)}} else if (isSmartisan()) { // 权限管理 -> 自启动权限管理 -> 点击应用 -> 允许被系统启动LogUtil.e("checkBackgroundPermission", "isSmartisan")try {showActivity(context, "com.smartisanos.security")} catch (e: Exception) {LogUtil.e("checkBackgroundPermission", "isSmartisan e: " + e.message)showDetailActivity(context)}}
}

基本就这些了,各位可以自己copy下来调试调试。可以参考下下面这篇文章,当时特意下了悦跑圈来看这个应用怎么实现的,也感谢作者的开源精神。添加链接描述
https://juejin.im/post/6844904023955341319

android app后台运行相关推荐

  1. Android app后台运行休眠仍然可以运行的方法(确保一直运行)

    在播放器app中由于需要用后台service 来播放音乐,所以一旦进入休眠状态时,就有可能被杀掉进程 所以需要让service 一直运行不被杀掉进程 在android 中WakeLock的相关 API ...

  2. react native Android端保持APP后台运行--封装 Headless JS

    react native Android端保持APP后台运行--封装 Headless JS 前些日子在做后台下载时踩了后台运行这个大坑,RN官网文档上面在安卓上提供了Headless JS方法,iO ...

  3. 白鹭引擎用java_白鹭引擎发布 5.1.6 版 优化打包 iOS Android App 的运行性能

    原标题:白鹭引擎发布 5.1.6 版 优化打包 iOS Android App 的运行性能 在3月12日,我们将为白鹭引擎推出5.1.6 版本.5.1.6版本是对去年12月份发布的5.1版本的一次功能 ...

  4. 解决:Android App 在运行时候按下 home 键,让App 在后台运行,点击图标再次进入时防止应用重新启动

    一些体验上的优化 一:app 退出时,让 app 在后台运行,类似于 home 键的功能,最小化 二:Android 点击 Home 键后再点击 APP 图标,APP 显示退出之前的界面 一:app ...

  5. Android App后台、锁屏运行,百度定位不实时定位。未解问题,求大神指教?

    细节描述: 功能需要实现:App 一直给后台上传经纬度.(正常运行,后台运行,锁屏运行) 问题描述:红米Note 5A. 在A点,App 锁屏,走到B 点,然而在A---B之间一直上传的是A点锁屏前的 ...

  6. unity android 在后台运行_Android 11“精简版”正式发布,低端机也可以流畅运行

    虽然Android依然是全世界使用最多的手机操作系统,但与iOS相比,由于Android的自身特性在长时间使用后会产生很多垃圾文件,久而久之手机就会变得越来越卡顿,对于一款旗舰机而言,这种卡顿可能会来 ...

  7. Android app 后台被杀恢复

    android 模拟应用因内存不足被后台杀死命令 https://www.jianshu.com/p/effb4546b9aa adb shell am kill-all  应用通过home键已经停留 ...

  8. Android 启动后台运行程序(Service)

    Android开发中,当需要创建在后台运行的程序的时候,就要使用到Service.Service 可以分为有无限生命和有限生命两种.特别需要注意的是Service跟Activities是不同的(简单来 ...

  9. Android 程序后台运行和锁屏运行

    Android 后台服务保活 需求 方案 推广一下我的个人博客小站: Z同学 期待大家的围观 需求 1.在华为手机中应用切换到后台后,打开其他app.需要我的应用后台仍然能够访问http,传输数据. ...

  10. 后台推送消息给app_小米加入统一推送联盟!避免多种APP后台运行,国产手机春天来了...

    近日,统一推送联盟称,小米手机(含Redmi品牌在内)的系统推送服务已符合统一推送的各项技术要求.截至目前,在中国市场上具有一定知名度.号召力的安卓手机品牌几乎都已经加入统一推送联盟,除了有华为.vi ...

最新文章

  1. C语言 | C51实现MAX485通信(完整源代码)
  2. 浅拷贝与深拷贝的区别
  3. log4j配置文件中使用变量
  4. NET问答: 为什么 null + true = string 呢?
  5. java改文字乱码快捷键,java.util.Properties读取中文内容(UTF-8格式)的配置文件,发生中文乱码...
  6. Matlab入门(一)
  7. win32开发(消息机制)
  8. SQL命令向表中添加列
  9. 【cluvfy】集群验证工具cluvfy使用方法——stage
  10. Linux命令行报错 bash: cannot create temp file for here-document: No space left on device
  11. stm32CubeMx lwip + freeRTOS
  12. EDA发展历史及现状
  13. Win7上USB转串口芯片ch341驱动安装方法
  14. 在线思维导图的制作教程分享,帮你快速掌握绘制要领
  15. 双足机器人课设报告_小型舞蹈双足机器人的设计及实现
  16. Vue报错:contains both .browserslistrc and package.json with browsers
  17. 本地网络出现了一个意外的情况,不能完成所有你在设置中所要求的更改
  18. 痴情只为无情苦,我欲真心对人 却成了种错情根,人活在世上 究竟是为了什么
  19. python 爬取搞笑视频_爬虫篇 | 用Python爬超级搞笑的视频
  20. 【ParaView教程】第四章 常见问题 —— 怎样在ParaView中将颜色预设默认设为Blue to Red Rainbow?

热门文章

  1. IOS APP Store下载链接
  2. 怎样修改用户的计算机配置文件,计算机本地用户配置文件如何迁移至域账户
  3. 你的脸儿圆又圆改变MSN头像(转)
  4. (c++课程设计)简单车辆管理系统(有五种类型的车辆)代码+报告
  5. 网页视频播放器代码大全 + 21个为您的网站和博客提供的免费视频播放器
  6. 网络“投毒”系列报告:全国多省软件升级劫持攻击事件数据分析
  7. win11toast:python桌面通知工具
  8. Android得到位图方式
  9. 毕业设计 python opencv 机器视觉图像拼接算法
  10. 如何免费下载百度文库文档