Git Product home page Git Product logo

hellodaemon's Introduction

HelloDaemon

Android 服务保活/常驻 (Android Service Daemon)

建议只在App的核心功能需要保活/常驻时使用。

本示例中使用的保活方法部分来源于下面的博客和库。启动前台服务而不显示通知来自于D-clock的AndroidDaemonService,对其他的一些非native层保活方法进行了实现。

Android 进程常驻(2)----细数利用android系统机制的保活手段

D-clock / AndroidDaemonService

实现了上面 2 个链接中的大多数保活思路 :

1. 将Service设置为前台服务而不显示通知

D-clock :

思路一:API < 18,启动前台Service时直接传入new Notification();

思路二:API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理;

//启动前台服务而不显示通知的漏洞已在 API Level 25 修复,大快人心!

前台服务相对于后台服务的优势,除了优先级的提升以外,还有一点:

在最近任务列表中划掉卡片时,前台服务不会停止;

(更新:经过测试,发现只是对于AOSP/CM/国际上对Framework层改动较小的Android系统是成立的;EMUI/MIUI等未加入白名单的情况下,划掉卡片,前台服务也会停止;加入白名单后划掉卡片的行为与国际厂商的系统相似。)

而后台服务会停止,并在稍后重新启动(onStartCommand 返回 START_STICKY 时)。

前台服务和后台服务被划掉卡片时,回调的都是 onTaskRemoved 方法。

onDestroy 方法只在 设置 -> 开发者选项 -> 正在运行的服务 里停止服务时才会回调。

2. 在 Service 的 onStartCommand 方法里返回 START_STICKY

3. 覆盖 Service 的 onDestroy/onTaskRemoved 方法, 保存数据到磁盘, 然后重新拉起服务

4. 监听 8 种系统广播 :

CONNECTIVITY_CHANGE, USER_PRESENT, ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED, BOOT_COMPLETED, PACKAGE_ADDED, PACKAGE_REMOVED.

在网络连接改变, 用户屏幕解锁, 电源连接 / 断开, 系统启动完成, 安装 / 卸载软件包时拉起 Service.

Service 内部做了判断,若 Service 已在运行,不会重复启动.

5. 开启守护服务 : 定时检查服务是否在运行,如果不在运行就拉起来

6. 守护 Service 组件的启用状态, 使其不被 MAT 等工具禁用

详见上面的 2 个链接。

增加实现 :

+ 守护服务 : Android 5.0 及以上版本使用 JobScheduler,效果比 AlarmManager 好

使用 JobScheduler, Android 系统能自动拉起被 Force Stop 的 Package,而 AlarmManager 无法拉起.

Android 4.4 及以下版本使用 AlarmManager.

+ 使用定时 Observable : 避免 Android 定制系统 JobScheduler / AlarmManager 唤醒间隔不稳定的情况

+ 增加停止服务并取消定时唤醒的快捷方法

+ 增加在不需要服务运行时取消 Job / Alarm / Subscription 的快捷方法 (广播 Action)

+ 增强对国产机型的适配 : 防止华为机型按返回键回到桌面再锁屏后几秒钟进程被杀

测试机型 : 华为 荣耀6 Plus (EMUI 4.0 Android 6.0), 应用未加入白名单.

观察到 :

在未加入白名单的情况下,按Back键回到桌面再锁屏后几秒钟即会杀掉进程;

但是按Home键返回桌面的话,即使锁屏,也不会杀掉进程。

(更新:经过测试,在EMUI系统上,『即使锁屏,也不会杀掉进程』只对App的卡片还在多任务屏幕的第一屏时有效,一旦被挤到第二页及以后,锁屏后几秒钟即会杀掉进程;加入白名单后,回到桌面再锁屏后不会杀进程。)

因此,重写了onBackPressed方法,使其只是返回到桌面,而不是将当前Activity finish/destroy掉。

测试机型 : 红米1S 4G (MIUI 8 Android 4.4.2), 应用未加入白名单.

观察到 :

在未加入白名单的情况下,回到桌面再锁屏后不会杀进程;

但划掉卡片,进程死亡并不再启动;加入白名单后,划掉卡片,服务不会停止,与CM的行为相似。

可以看出,若不想使用Native保活,引导用户加入白名单可能是比较可行的方法。

+ 用 Intent 跳转

  • Android Doze 模式
  • 华为 自启管理
  • 华为 锁屏清理
  • 小米 自启动管理
  • 小米 神隐模式
  • 三星 5.0/5.1 自启动应用程序管理
  • 三星 6.0+ 未监视的应用程序管理
  • 魅族 自启动管理
  • 魅族 待机耗电管理
  • Oppo 自启动管理
  • Vivo 后台高耗电
  • 金立 应用自启
  • 金立 绿色后台
  • 乐视 自启动管理
  • 乐视 应用保护
  • 酷派 自启动管理
  • 联想 后台管理
  • 联想 后台耗电优化
  • 中兴 自启管理
  • 中兴 锁屏加速受保护应用

配合 android.support.v7.AlertDialog 引导用户将 App 加入白名单.

+ 守护服务和BroadcastReceiver运行在:watch子进程中,与主进程分离

+ 工作服务运行在主进程中,免去与服务通信需使用AIDL或其他IPC方式的麻烦

参考了 Poweramp, 启动的前台服务与 UI 运行在同一进程中。

+ 做了防止重复启动Service的处理,可以任意调用startService(Intent i)

若服务还在运行,就什么也不做;若服务不在运行就拉起来。

+ 在子线程中运行定时任务,处理了运行前检查和销毁时保存的问题

开始任务前,先检查磁盘中是否有上次销毁时保存的数据;定期将数据保存到磁盘。

引入

1. 添加二进制

build.gradle 中添加

compile 'com.xdandroid:hellodaemon:+'

2. 继承 AbsWorkService, 实现 6 个抽象方法

/**
 * 是否 任务完成, 不再需要服务运行?
 * @return 应当停止服务, true; 应当启动服务, false; 无法判断, null.
 */
Boolean shouldStopService();

/**
 * 任务是否正在运行?
 * @return 任务正在运行, true; 任务当前不在运行, false; 无法判断, null.
 */
Boolean isWorkRunning();

void startWork();

void stopWork();

//Service.onBind(Intent intent)
@Nullable IBinder onBind(Intent intent, Void unused);

//服务被杀时调用, 可以在这里面保存数据.
void onServiceKilled();

别忘了在 Manifest 中注册这个 Service.

3. 自定义 Application

在 Application 的 onCreate() 中, 调用

DaemonEnv.initialize(
  Context app,  //Application Context.
  Class<? extends AbsWorkService> serviceClass, //刚才创建的 Service 对应的 Class 对象.
  @Nullable Integer wakeUpInterval);  //定时唤醒的时间间隔(ms), 默认 6 分钟.

Context.startService(new Intent(Context app, Class<? extends AbsWorkService> serviceClass));

别忘了在 Manifest 中通过 android:name 使用这个自定义的 Application.

4. API 说明

启动 Service:

Context.startService(new Intent(Context c, Class<? extends AbsWorkService> serviceClass))

停止 Service:

在 ? extends AbsWorkService 中, 添加 stopService() 方法:

1.操作自己维护的 flag, 使 shouldStopService() 返回 true;

2.调用自己的方法或第三方 SDK 提供的 API, 停止任务;

3.调用 AbsWorkService.cancelJobAlarmSub() 取消 Job / Alarm / Subscription.

需要停止服务时, 调用 ? extends AbsWorkService 上的 stopService() 即可.

处理白名单:

以下 API 全部位于 IntentWrapper 中:

List<IntentWrapper> getIntentWrapperList();

//弹出 android.support.v7.AlertDialog, 引导用户将 App 加入白名单.
void whiteListMatters(Activity a, String reason);

//防止华为机型未加入白名单时按返回键回到桌面再锁屏后几秒钟进程被杀.
//重写 MainActivity.onBackPressed(), 只保留对以下 API 的调用.
void onBackPressed(Activity a);

为节省用户的电量, 当不再需要服务运行时, 可以调用 AbsWorkService.cancelJobAlarmSub() 取消定时唤醒的 Job / Alarm / Subscription, 并调用 stopService() 停止服务.

详见代码及注释。

hellodaemon's People

Contributors

qiubaiying avatar xingda920813 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hellodaemon's Issues

主服务无法启动和白名单弹窗

1.项目需要显示主服务的通知栏,在Activity关闭的时候需要关掉通知栏,使用stopForground(ture)关掉了通知栏,结果主服务下一次无法正常启动了(startWork()方法没走了),其实我真正的目的是想唤醒gps定位。
2.加入白名单的弹窗每一次都会弹,我选择了自启动和耗电管理了,下次还是会弹出来。

在小米4和红米note1上有问题

小米4,android4.4系统,杀了多次服务虽然会重启,但最后一次虽然服务在进程上看是启动了,但方法不知道为什么卡住了,不会调用
红米note1,android5.0,删了之后直接服务挂掉了

后台定时任务会运行越来越慢

测试机:小米Note4x,VIVO

具体:每隔一分钟运行一次任务,但是越往后,任务运行越慢。

代码:
StartWork内代码, frequency为60s

sDisposable = Flowable.interval(frequency, TimeUnit.SECONDS)
// 取消任务时取消定时唤醒
.doOnTerminate(new Action() {

                            @Override
                            public void run() throws Exception {
                                cancelJobAlarmSub();
                            }

                        }).subscribe(new Consumer<Long>() {

                            @Override
                            public void accept(Long count) throws Exception {
                                        com.tzunicom.soft.logger.Logger.addRecordToLog(String.format("每 %s 秒上传一次位置... count = %s", frequency, count));
                                        locationService.startLocation();
                            }

                        });

how to get ComponentName?

每个厂商的自启动页面的组件名称是如何获取的?
例如: com.letv.android.letvsafe , com.letv.android.letvsafe.AutobootManageActivity 这个名称是如何获取的。
letvIntent.setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity"));
有相关的博客地址,参考么?

关于白名单设置

老哥,你是怎么兼容各个手机版本的省电管理的。

例如我有个魅族note5,用了
Intent mzKeeper = new Intent();
mzKeeper.setComponent(new ComponentName("com.meizu.safe","com.meizu.safe.powerui.PowerAppPermissionActivity"));
keepers.add(mzKeeper);

没有效果。

我想问下你是怎么知道省电管理的Activity全名的,这样下次有其他手机需要兼容的话,可以举一反三。

谢谢

你在逗我呢!

哪里有双服务互拉!!!!!明明是搞多了一个服务开启前台服务,为了不让用户看到弹出的通知栏

在android5.0.1上运行你的Demo,先停止服务,后开启不成功

在android5.0.1上运行你的Demo,先停止服务,后开启不成功.日志如下:

07-06 11:50:56.132 17004-17058/com.xdandroid.sample I/System.out: 每 3 秒采集一次数据... count = 0
07-06 11:50:59.132 17004-17058/com.xdandroid.sample I/System.out: 每 3 秒采集一次数据... count = 1
07-06 11:51:02.132 17004-17058/com.xdandroid.sample I/System.out: 每 3 秒采集一次数据... count = 2
07-06 11:51:05.132 17004-17058/com.xdandroid.sample I/System.out: 每 3 秒采集一次数据... count = 3
07-06 11:51:08.132 17004-17058/com.xdandroid.sample I/System.out: 每 3 秒采集一次数据... count = 4
07-06 11:51:11.132 17004-17058/com.xdandroid.sample I/System.out: 每 3 秒采集一次数据... count = 5
07-06 11:51:11.962 17004-17031/com.xdandroid.sample D/GraphicBuffer: register, handle(0xb7956d60) (w:600 h:1024 s:608 f:0x1 u:0x000f02)
07-06 11:51:11.979 17004-17031/com.xdandroid.sample D/GraphicBuffer: register, handle(0xb79251b8) (w:600 h:1024 s:608 f:0x1 u:0x000f02)
07-06 11:51:12.054 17004-17004/com.xdandroid.sample V/SettingsInterface: invalidate [system]: current 28 != cached 0
07-06 11:51:12.056 17004-17004/com.xdandroid.sample D/ActivityThread: hoder:android.app.IActivityManager$ContentProviderHolder@295fd50,provider,holder.Provider:android.content.ContentProviderProxy@8eb6b49
07-06 11:51:12.101 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.108 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100829640061
07-06 11:51:12.117 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.124 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100846370499
07-06 11:51:12.131 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.141 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100863111106
07-06 11:51:12.148 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.158 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100879853715
07-06 11:51:12.165 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.174 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100896601164
07-06 11:51:12.184 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.191 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100913339958
07-06 11:51:12.201 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.208 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100930080389
07-06 11:51:12.220 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.224 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100946825854
07-06 11:51:12.235 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.241 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100963567997
07-06 11:51:12.256 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:51:12.258 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10100980314053
07-06 11:52:01.717 17004-17004/com.xdandroid.sample V/SettingsInterface: from settings cache , name = sound_effects_enabled , value = 0
07-06 11:52:01.719 17004-17004/com.xdandroid.sample D/ActivityThread: SVC-Calling onStartCommand: com.xdandroid.sample.TraceServiceImpl@169b9c4a, flags=0, startId=3
07-06 11:52:01.733 17004-17004/com.xdandroid.sample D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@3dce3db5 startId=3 args=Intent { cmp=com.xdandroid.sample/.TraceServiceImpl }}
07-06 11:52:01.852 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.858 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150580198276
07-06 11:52:01.870 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.874 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150596949045
07-06 11:52:01.887 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.891 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150613694692
07-06 11:52:01.907 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.926 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150647168728
07-06 11:52:01.946 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.960 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150680653873
07-06 11:52:01.970 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.975 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150697395891
07-06 11:52:01.986 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:01.992 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150714152333
07-06 11:52:02.005 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:02.008 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150730877491
07-06 11:52:02.019 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync
07-06 11:52:02.025 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 latestVsyncEvent 10150747622324
07-06 11:52:02.035 17004-17031/com.xdandroid.sample D/OpenGLRenderer: DisplayEventReceiver 0xb7879120 requestNextVsync

博主项目里的rxjava2和rxjava1.1x版本编译时候冲突.求教方法.

博主项目自带的依赖compile 'io.reactivex.rxjava2:rxjava:2.+'
而我自己的项目里依赖了:
compile 'io.reactivex:rxjava:1.1.6'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

编译时候,就会提示有2个不同版本的rxjava,导致便以失败.求教怎么解决呢.

Doze模式的检测,为什么跳过了安卓M

是手误M敲成了N吗?

另外,我看摩拜单车在MIUI上的表现,直接转跳到了摩拜单车的神隐模式界面,而不是所有应用的神隐模式界面。在网上也找了资料,也看了MIUI设置的Manifest ,实在没找到,您可以找找看吗?这个作用还是挺大的。

还有,我希望whiteListMatters能有个返回值,表示遍历那些机型有没有匹配的。

谢谢

引入错误

Error:Execution failed for task ':app:transformClassesWithDexForDebug'.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException

加入“多任务界面锁定”

发现了 钉钉 的引导 设置 接口:
小米的
https://tms.dingtalk.com/markets/dingtalk/android/msg/help?brand=Xiaomi&model=Redmi+Note+4&rom_version=V8&os_version=6.0&locale=zh_CN

华为的
https://tms.dingtalk.com/markets/dingtalk/android/msg/help?brand=Huawei&model=HUAWEI+MT7-TL10&rom_version=V8&os_version=6.0&locale=zh_CN

在 多任务界面 锁定APP后,以后 App在打开状态下,统一清理任务,该App不会被清理掉。(单独划掉清理该App,会被清理掉)
那么是否需要 加入这个呢?

请问要保活多个service的方案

请问有多个service需要保活,是每个service都单独保活,还是保活一个然后让被保活的去管理其他的呢?不知道每个service单独保活会不会增大开销呢?

测试手机 华为mate7 6.0系统

1,运行app,点击按钮启动服务,不返回到后台,1个小时没发现WorkService被杀死

2,运行app,点击按钮启动服务,返回到后台,主进程被杀死,WorkService所在的work进程没有被杀 死,但是运行手机自带清理软件或者360清理软件之后,WorkService死掉没有重启

3,运行app,点击按钮启动服务,手机锁屏一段时间进入睡眠。虽然设置了闹钟15分钟唤醒。测试经过了半小时都无法唤醒!

能弹出doze模式相应对话框,点确定无反应。

能弹出doze模式相应对话框,点确定无反应。测试机型 华为畅享7 plus ,一加三 ,系统均为7.0,看日志无报错。 还是华为畅享7 plus 同时弹出三个对话框 type: 98 ,99 ,100,点确定未跳转前已经看到了第二个对话框。感觉用户体验不是很好,有没有办法改善下。

博主 我的服务启动不起来

startWork方法没执行,但是在正在运行的列表里面可以看到我写的Service,清单文件也注册了,Application里面也写了初始化的方法

Oppo 自启动管理ComponentName 问题

在实际的使用过程中发现oppo的手机并没有弹出相应的权限窗口,于是我重新获取了一下ComponentName,发现我用的手机名称为"com.color.safecenter",与代码中提供的名称不一致,添加如下代码后,在oppo A53手机上正常弹出了权限设置窗口。
Intent colorIntent = new Intent();
colorIntent.setComponent(new ComponentName("com.color.safecenter", "com.color.safecenter.permission.startup.StartupAppListActivity"));
INTENT_WRAPPER_LIST.add(new IntentWrapper(colorIntent, OPPO));

miui8 白名单锁屏状态下服务没有定时启动

集成时候在使用的时候发现,手机锁屏之后即是加入神隐模式的无限制,自动启动和后台清理白名单的情况下服务虽然继续在运行但是回调却不再执行了。
miui版本8.5.30
安卓版本7
定时间隔设置为3*60秒

08-09 16:31:10.509 31729-31761/com.xdandroid.sample I/System.out: 每 3 *60秒采集一次数据... count = 0
08-09 16:39:30.797 31729-31761/com.xdandroid.sample I/System.out: 每 3 *60秒采集一次数据... count = 1
08-09 16:42:30.797 31729-31761/com.xdandroid.sample I/System.out: 每 3 *60秒采集一次数据... count = 2
08-09 16:51:17.726 31729-31761/com.xdandroid.sample I/System.out: 每 3 *60秒采集一次数据... count = 3
31-39 42-51 之间没有执行任务
这个是什么问题导致的,麻烦能不能解答下,谢谢。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.