奥利奥中的活动识别持续服务

4

我一直在努力解决这个问题,但迄今为止没有找到解决方案。我看过很多关于如何实现此功能的指南(文档教程),并且成功地在Android 7上实现了它。我所做的是,在用户活动改变时成功接收到后台运行服务的通知。我的应用程序工作得非常完美。问题出在Android 8和Google电池管理上。我的服务总是被杀掉。因此...我已经尝试过以下方法来解决这个问题:

  1. Explain the user how to disable battery optimization for my app so it will not kill my service. The problem is its too comlicated for cummon user.

  2. Add

    uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
    

然后使用代码进行检查:

Intent intent = new Intent();
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (pm.isIgnoringBatteryOptimizations(packageName)){
                    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);

                }
                else {
                    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    intent.setData(Uri.parse("package:" + packageName));
                }
            }
            context.startActivity(intent);

我知道我的应用可能会被Play商店禁止,这是一个大问题。

  1. 使用前台服务和持久通知。问题是用户经常看到这些持续的而且有时不相关的通知,这很烦人。

那么,我如何在Android 8中使用 ActivityRecognitionClient ,即使我的应用程序在后台运行也始终接收活动更改通知?也许可以直接连接Google服务来实现这一点?


DetectedActivityFence 会有用吗?请参见 https://developers.google.com/awareness/android-api/fence-api-overview - stkent
实际上这很有用。也许我会使用这个API代替当前的API,因为它有更多的功能。但它仍然需要在后台运行服务,不是吗?如果是这样,问题仍然存在。 - Dim
1
我不确定 Oreo 中的意识 API 本身会受到什么影响,但系统会监视并发送广播。一旦您收到围栏的广播,最安全的做法是在响应广播时使用 startForegroundService()。即使您的应用程序在后台运行,相应的用户界面通知也只会短暂可见。 - stkent
Awareness API正是我所需要的,通过使用广播接收器,我可以实现我想要的功能。您能否将其发布为答案? - Dim
当然没问题;已发布!很高兴这对你有用 :) - stkent
1个回答

3
考虑使用意识 API 中的 DetectedActivityFence。在这种情况下,是系统监视并向您发送广播,因此无需运行自己的后台服务。
一旦您接收到围栏广播,就可以使用 startForegroundService 来响应广播。即使您的应用程序在后台运行,相应的用户界面通知也只会短暂显示。

嗨,我已经将我的应用程序迁移到使用DetectedActivityFence。它工作得还好...有时候接收到关于活动变化的广播需要太长时间。但大多数情况下它都能正常工作。但在一些设备上,比如三星,当应用程序关闭时根本不起作用。你有什么想法可以改善刷新时间或者为什么它在一些设备上无法工作(无法接收广播)? - Dim
很不幸,我对解决你描述的问题没有任何建议 :/ - stkent
@Dim 你找到解决三星问题的方法了吗? - dor506
@dor506 抱歉,我找到了一些其他手机(一些小米型号)也有这个问题。由于调试和测试非常困难,我暂时放下了正在开发的应用程序。也许在ActivityRecognitionApi更新或出现其他解决方案后,我会回来继续开发。如果你找到了任何解决方案,我很乐意听取你的建议。 - Dim
只是提供信息,不确定是否有所不同,但安卓已发布了一个名为Activity Transition Api的新API。https://developer.android.com/guide/topics/location/transitions - Andrew Irwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接