我想写一个后台定时服务代码,用来 10 分钟后自动熄灭小米平板屏幕的程序。
在安卓模拟器和以前的 MIUI 系统上,运行完全没问题,一放到澎湃 OS 上,服务就老是被冻结。(以前 MIUI 内存不足是直接杀服务,由于设置了 START_STICKY ,5 秒钟后会被系统自动拉起来,包括安卓 14 模拟器也是走这个流程)
查了一下,是一个 com.miui.powerkeeper 的进程干的好事。我用 ADB 设置了 RUN_ANY_IN_BACKGROUND allow, deviceidle whitelist +[应用的包名], 电池无优化,都会随机不定时被冻结,百思不得其解。
而且如果调试程序 XML 里有后台隐私相关权限,比如 READ_CLIPBOARD_IN_BACKGROUND/GET_TASKS ,包名会被 com.miui.powerkeeper 拉黑,现象是无法弹出电池优化的按钮。解决方法是把权限去掉+换包名字。
1
magicls 35 天前
试试先正向,先在什么手机管家,安全管家里面,找找入口,把自己的应用加白名单。然后 recents 里面把自己锁定。另外请求一下忽略电池优化,把自己加白。
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> @RequiresApi(api = Build.VERSION_CODES.M) public void requestIgnoreBatteryOptimizations() { try { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } 这些都不行的话,再考虑 adb 那些骚操作。 |
2
minami 35 天前 1
|
3
tool2dx OP @magicls 试过了,好像没用,我代码里有申请这个权限。
用的是这个代码,感觉和设置里的省电策略 = 无限制是一回事。 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); if (pm != null && !pm.isIgnoringBatteryOptimizations(packageName)) { intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); ... } |
4
tool2dx OP @minami 我把 com.miui.powerkeeper 关掉后,运行很完美。但总觉得好奇葩,在要不要改自己代码和关闭 com.miui.powerkeeper 之间反复纠结。
|
5
tsja 35 天前
不懂安卓开发, 要开发 App, 都要针对性适配每家的定制系统吗?
|
6
tool2dx OP |
7
bkmi 35 天前
这个真不能怪小米,你要保活服务就按照 Android 官方的规范来申请前台服务,或者试试 JobScheduler (我估计不行);
READ_CLIPBOARD_IN_BACKGROUND 就只能怪 Google 垃圾,不给开发者一点余地,直接一刀切,我都是 Root 了用 Xposed 绕过。 |
10
bkmi 35 天前
另外印象中 READ_CLIPBOARD_IN_BACKGROUND 这个权限只能系统应用申请,普通应用是无法申请的
|
11
xloger 35 天前
如果用小米自带的“自动任务”来实现呢?靠它实现按规律唤起某个 App ,然后 App 再执行某些操作?
|
12
lisongeee 35 天前
我以前在上面开发的时候,在后台新启动子线程 thread{} 里面的代码竟然不执行,需要把界面切到前台才会执行
|
13
tool2dx OP @xloger 我是通过路由器调用 adb ,来远程启动小米平板上指定 service ,唤醒 APP 不是问题,保活是个难题。
我已经准备改成在路由器定时 10 分钟,之后再调用 adb 指令了 -_- |
14
shily 35 天前
|
15
JensenQian 35 天前 2
国内安卓不这么压,流氓软件,三 A 大作,塞虚幻引擎的聊天软件不然根本压不住啊
只有流氓才能打败流氓 |
16
reallittoma 35 天前
在 MIUI 上开发也难用,合理怀疑所有国产 UI 都难用。后来买了一台二手美版三星做开发机,舒服了。
|
17
GotKiCry 35 天前
@JensenQian 这你这么说不矛盾吗。现在厂商都是给虚幻聊天软件白名单
|
18
anjingdexiaocai 35 天前 via Android
现在只有提高 app 的活跃等级才行,也就是让系统认为你是处于前台,目前合规的办法只有前台服务。
|
19
JensenQian 35 天前
@GotKiCry 哈哈哈
3A 聊天软件,还得开白名单 |
20
dntilee 35 天前
我在国内工作最开心的日子是在小米写系统应用的日子,不用担心任何权限
|
21
CSGO 35 天前
root 。取消白名单
|
23
icestraw 35 天前 1
感觉问题出在“操作系统功能”上,也就是关屏幕,这个权限理论上应该只有无障碍应用能操作。
任何系统,写后台操作系统功能的代码,都不应该太容易,不然很容易就变成神仙打架。不然任何程序只要加一句你这个代码,就可以无限制保活,那生态也太乱了。 |
24
bzkmsjy 35 天前
audiorelay 在澎湃上也无法保持后台,root 了也不知道有什么办法保活,酷安上我也发过帖,没找到办法
|
25
tool2dx OP @icestraw 关屏幕是用户自己在设置里授权 APP 操作的,这个问题不大。后台其实安卓官方有提供电源管理选项,每一个 APP 设置都是可选的。小米的手机管家是二次封装,如果直接沿用谷歌的电池管理系统,就没有那么多麻烦事情了。
|
27
icestraw 35 天前 3
@tool2dx 关屏幕权限,从设计上看,理论上是应该控制“当你使用过程中”关屏幕,而不是“离开前台程序后”关屏幕。前者是 App 的正常操作,后者则是权限要求非常高的系统工具。对于国产 ROM 面对的恶劣安卓环境,策略严格一些感觉可以理解。
其实 无障碍 这个权限 已经有些滥用了,现在百度啊甚至小红书都有声明这个权限,这些软件哪里会需要这个功能...不得不防啊 |
28
lisxour 35 天前
之前不是出过一个黑科技保活的嘛,试试?百度、github 现在应该还能搜到
|
30
Ruikoto 35 天前
我使用世界迷雾(后台记录 GPS 位置)的时候也有保活问题,如果放在后台,记录出的轨迹就会断断续续,这个问题苦恼我好久了,不知作为用户是否有什么办法
|
31
jarvay 35 天前
https://github.com/Jarvay/workpaper-android
这个是我写的定时换壁纸工具,用的是 29 楼说的 WorkManager ,service 设置成前台+省电策略无限制在澎湃上就能正常执行定时任务 |
33
wdv2ly 34 天前 via Android
@reallittoma 哥们儿你这不是掩耳盗铃嘛?你开发舒服了,你的用户不舒服了哈哈
|
34
behindeye 34 天前
开启前台服务+开启悬浮窗权限+后台运行开启+电池优化+使用 WorkManager 试试
|
35
okakuyang 34 天前 1
我说实话,你这个标题和你的内容有夸大的成分。你要开发一个能够熄屏的程序而且是在后台,这个已经大大超出一般 App 的职能范围。遇到坑也是可以预见的,省电管理程序,白名单已经是各家手机厂的基本操作,不存在小米一家这么做。如果我要做这功能我肯定首先要在更加简洁的固件上去开发。
|
36
tool2dx OP |
38
h1298841903 34 天前
@tsja 各家都有各家的 bug
|
39
lucifer9 33 天前
小米的系统最离谱的是用户手动设置了允许自启动的应用
系统隔一段时间会随机帮用户取消几个自启动权限 要是说总数会有限制,起码明确写出来啊 |
40
tyzandhr 32 天前 via Android
设置前台服务并且显示通知了吗?现在 Android 规范里面就是只有前台服务能够保证一直运行。或者,你也可以用 WorkManager 。
|
41
RikkaW 32 天前
READ_CLIPBOARD_IN_BACKGROUND 和 GET_TASKS 不是普通应用都用不了吗(
|
42
reallittoma 29 天前
@wdv2ly #33 还好吧,我的用户主要是海外用户
|
43
mtdhllf 4 天前
老老实实前台服务,大家都像你这样后台偷偷摸摸坑用户你觉得行嘛
|