是否有本机android方式从服务获取对当前正在运行的Activity的引用?
我有一个在后台运行的服务,当事件发生时(在服务中),我想更新当前的活动。有没有简单的方法可以做到这一点(就像我上面建议的那样)?]>
是否有原生的android方法从服务获取对当前正在运行的Activity的引用?我有一个在后台运行的服务,当...
是否有本机android方式从服务获取对当前正在运行的Activity的引用?
Update:此no longer works具有other apps'
[Google has threatened]从Play商店中删除应用程序(如果它们出于可访问性目的使用可访问性服务)。但是,this is reportedly being reconsidered。
可以通过:
实现您自己的应用程序类,注册ActivityLifecycleCallbacks-这样您就可以查看我们的应用程序正在发生什么。在每次继续执行时,回调都会在屏幕上分配当前可见的活动,并在暂停时将其删除。它使用API 14中添加的方法AccessibilityService
。
AccessibilityService
我找不到能使我们的团队满意的解决方案,所以我们自己动手了。我们使用<?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容器配置为返回
AccessibilityService
的this StackOverflow answer实例,例如
getApplication()
如果只想知道包含当前活动的应用程序
,则可以使用app.getActiveActivity()
。您可以使用的技术取决于Android版本:我正在使用它进行测试。它是API> 19,而only
用于应用程序的活动。ActivityManager.getRunningTasks
将此代码用于API 21或更高版本。与其他答案相比,此方法有效并给出了更好的结果,它可以完美地检测到前台进程。
ActivityManager.getRunningTasks
这是我的回答,效果很好...
您应该可以通过这种方式获得当前的活动...如果您用一些带有很多片段的Activity来构建应用程序,并且想要跟踪当前的Activity是什么,那么它将需要很多工作。我的观点是我确实有一个带有多个片段的活动。因此,我可以通过Application Object跟踪Current Activity,该对象可以存储Global变量的所有当前状态。
这里是一种方法。启动活动时,您可以通过以下方式存储该活动:Application.setCurrentActivity(getIntent());该应用程序将存储它。在您的服务课程中,您只需意向currentIntent = Application.getCurrentActivity();getApplication()。startActivity(currentIntent);
我不知道这是否是一个愚蠢的答案,但是通过每次我输入任何活动的onCreate()时都在共享的首选项中存储一个标志来解决此问题,然后我使用了舍弃的首选项中的值来找出它的前景活动。
最近才发现这一点。使用api作为: