Android:如何从服务中获取当前的前台活动?

问题描述 投票:179回答:11

是否有本机android方式从服务获取对当前正在运行的Activity的引用?

我有一个在后台运行的服务,当事件发生时(在服务中),我想更新当前的活动。有没有简单的方法可以做到这一点(就像我上面建议的那样)?]​​>

是否有原生的android方法从服务获取对当前正在运行的Activity的引用?我有一个在后台运行的服务,当...

android service android-activity
11个回答
87
投票

是否有本机android方式从服务获取对当前正在运行的Activity的引用?


139
投票

Update:此no longer works具有other apps'


111
投票

警告:违反Google Play规定

[Google has threatened]从Play商店中删除应用程序(如果它们出于可访问性目的使用可访问性服务)。但是,this is reportedly being reconsidered


19
投票

可以通过:

  1. 实现您自己的应用程序类,注册ActivityLifecycleCallbacks-这样您就可以查看我们的应用程序正在发生什么。在每次继续执行时,回调都会在屏幕上分配当前可见的活动,并在暂停时将其删除。它使用API​​ 14中添加的方法AccessibilityService

    AccessibilityService

16
投票

我找不到能使我们的团队满意的解决方案,所以我们自己动手了。我们使用<?xml version="1.0" encoding="utf-8"?> <!-- These options MUST be specified here in order for the events to be received on first start in Android 4.1.1 --> <accessibility-service xmlns:tools="http://schemas.android.com/tools" android:accessibilityEventTypes="typeWindowStateChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagIncludeNotImportantViews" android:description="@string/accessibility_service_description" xmlns:android="http://schemas.android.com/apk/res/android" tools:ignore="UnusedAttribute"/> 跟踪当前活动,然后通过服务将其公开:

AccessibilityService

然后将您的DI容器配置为返回AccessibilityServicethis StackOverflow answer实例,例如


13
投票

使用getApplication()

如果只想知道包含当前活动的应用程序

,则可以使用app.getActiveActivity()。您可以使用的技术取决于Android版本:

9
投票

我正在使用它进行测试。它是API> 19,而only

用于应用程序的活动。
ActivityManager.getRunningTasks

2
投票

将此代码用于API 21或更高版本。与其他答案相比,此方法有效并给出了更好的结果,它可以完美地检测到前台进程。

ActivityManager.getRunningTasks

0
投票

这是我的回答,效果很好...

您应该可以通过这种方式获得当前的活动...如果您用一些带有很多片段的Activity来构建应用程序,并且想要跟踪当前的Activity是什么,那么它将需要很多工作。我的观点是我确实有一个带有多个片段的活动。因此,我可以通过Application Object跟踪Current Activity,该对象可以存储Global变量的所有当前状态。

这里是一种方法。启动活动时,您可以通过以下方式存储该活动:Application.setCurrentActivity(getIntent());该应用程序将存储它。在您的服务课程中,您只需意向currentIntent = Application.getCurrentActivity();getApplication()。startActivity(currentIntent);


0
投票

我不知道这是否是一个愚蠢的答案,但是通过每次我输入任何活动的onCreate()时都在共享的首选项中存储一个标志来解决此问题,然后我使用了舍弃的首选项中的值来找出它的前景活动。


-3
投票

最近才发现这一点。使用api作为:

© www.soinside.com 2019 - 2024. All rights reserved.