当我的应用程序在后台运行时。它需要在前台监视其他应用程序交换并获取它们的名称。如何实施?即当应用程序进入前台时。必须通知我的应用程序。然后得到它的名字。
问问题
1224 次
3 回答
3
可访问性服务提供了一种获取当前前台服务的方法。
扩展 Accessibility Service 并创建一个新类。监听 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 事件。每当更改前台活动时都会触发此事件。与回调一起传递的事件对象包含前台应用程序的包名。
AccessibilityService.java
public class AccessibilityService extends android.accessibilityservice.AccessibilityService{
public static AccessibilityService instance;
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
// Note : This event is sometimes called more than one for a foreground service
if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
Log.d("Event","TYPE_WINDOW_STATE_CHANGED");
Log.d("Pkg",accessibilityEvent.getPackageName().toString());
}
}
@Override
public void onInterrupt() {
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.d("Accessibility","Service Connected");
}
}
要成功实现该服务,清单文件还必须在应用程序部分包含以下声明以及 res/xml 文件夹中的配置文件
<service android:name=".AccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig"/>
</service>
服务配置.xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
/>
确保用户授予无障碍服务权限。它需要从用户一侧手动启用。
获取前台进程名称的示例应用程序的完整代码可在https://github.com/abinpaul1/Android-Snippets/tree/master/GetForegroundService获得
于 2020-04-24T17:44:51.263 回答
0
我们不能使用 getRunningTasks,因为 android 指定“方法仅用于调试和呈现任务管理用户界面”。
没有直接的方法可以在后台或前台获取应用程序状态,但有可能了解应用程序何时是前台和后台有关更多详细信息:请参阅此处
于 2013-06-04T01:07:32.487 回答
0
为了监视其他应用程序,您可以使用ActivityManager来获取活动堆栈的当前顶级应用程序,如您的应用程序中一样:
ActivityManager am = (ActivityManager)context.getSystemService(Context. ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> processes1 = activityManager.getRunningTasks(1);
ComponentName componentInfo = processes1.get(0).topActivity;
String classname =processes1.get(0).topActivity.getClassName();
String packagename = processes1.get(0).topActivity.getPackageName();
于 2012-05-31T02:27:16.590 回答