【问题标题】:Start App From Service in BackGround in oreo and newer在 oreo 和更新版本的后台从服务启动应用程序
【发布时间】:2020-01-15 05:10:02
【问题描述】:

我的目标是在特定时间在每个地方(甚至锁定屏幕)显示活动。

在奥利奥之前,我可以在以前的安卓版本中完成这项工作,但是在奥利奥谷歌改变方法之后,“如果你想在 lockScreen 上显示一个视图,请使用“Activity.this.setShowWhenLocked(true);”:谷歌说。然后我必须创建一个活动并且只使用一个服务是不够的。

我的解决方案:我使用 AlarmManger 在特定时间在后台运行服务,该服务启动我的活动(我的目标)。

问题:在之前版本的 android 中,直到 Oreo ,我没有问题。应用程序工作正常。即使那个时候我从最近的应用程序中关闭我的应用程序,或者手机被锁定。但在 Oreo 和更新版本中,当应用程序在前台运行时。

point:在我的意图中,我使用这个标志:FLAG_ACTIVITY_NEW_TASK

问题:在奥利奥和更新版本中,即使应用关闭或手机锁定,如何从后台服务运行特定活动?

【问题讨论】:

  • 你找到解决办法了吗?

标签: android background-service


【解决方案1】:

您无法使用后台服务实现此预期结果,您必须考虑使用Foreground service 来完成此任务。在这里,您可以找到有关 Android 中前台服务的更多详细信息。 docs reference

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    对不起,这里的问题是如何在应用程序关闭时运行活动或任务。只要用户正在与应用程序交互或有显示任务进度的持久通知,前台服务就会存在,这里不是这种情况。

    我强烈建议你去找工作经理来执行后台任务。这里有一个很棒的代码实验室:

    https://codelabs.developers.google.com/codelabs/android-workmanager/#0

    并在此处阅读文档:

    https://developer.android.com/topic/libraries/architecture/workmanager

    【讨论】:

    • 谢谢。我读到了工作经理。 workmanger 太好了,但不适合我的应用程序,我在谷歌文档中读到,如果你想在精确的时间执行工作,请使用警报管理器,否则使用 workmanager,在这个应用程序中我需要精确的时间。我的主要问题是从后台运行活动。你有什么想法吗?我的服务在获取警报广播时运行,但是当应用程序在后台时无法在 Oreo 和更新版本中进行活动。
    【解决方案3】:

    除了我之前做过的工作,我在Xiaomi了解了MIUI 防止显示来自后台的弹出窗口d,然后我得到了它的许可并解决了问题,现在我可以在任何我想要的地方看到我的视图。以下是需要的人的简介:

    许可

    1.叠加窗口

    2.从背景弹出窗口(在小米和可能的其他中国手机用户界面中)

    级别

    1. AlarmManger 中设置Activity 中的alarmCalendarPendingIntent 以在特定时间运行我的Service

    2. 当我在Service 中计算我的值时,然后将Intent 计算为ActivityViewer,在这一步中,我将FLAG_ACTIVITY_NEW_TASK 添加到我的意图中(根据android Pie 中的谷歌文档,你必须将此标志添加到您的使用意图中)。

    3. 根据谷歌文档,在我的ActivityViewer 中,我使用Activity.setWhenLock() 方法在锁定屏幕中显示我的视图,并使用TYPE_APPLICATION_OVERLAY 用于奥利奥和更新版本,并使用TYPE_TOAST 用于版本6 直到奥利奥,并在 6 之前使用 TYPE_SYSTEM_ERROR,在 setLayoutParams 中使用 setType

    我使用此代码从小米的后台许可中获取弹出窗口:

    Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter",
                    "com.miui.permcenter.permissions.PermissionsEditorActivity");
            intent.putExtra("extra_pkgname", getPackageName());
            startActivity(intent);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多