アプリケーションがバックグラウンドで実行されているとき。フォアグラウンドで他のアプリケーションのスワッピングを監視し、それらの名前を取得する必要があります。実装方法は?つまり、アプリがフォアグラウンドに移動したとき。アプリに通知する必要があります。その後、その名前を取得します。
3 に答える
アクセシビリティサービスは、現在のフォアグラウンドサービスを取得する手段を提供します。
アクセシビリティサービスを拡張し、新しいクラスを作成します。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>
serviceconfig.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で入手できます。
他のアプリケーションを監視するために、 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();
androidは「メソッドはタスク管理ユーザーインターフェイスのデバッグと表示のみを目的としている」と指定しているため、getRunningTasksを使用できません。
バックグラウンドまたはフォアグラウンドでアプリのステータスを取得する直接的な方法はありませんが、アプリがフォアグラウンドおよびバックグラウンドであるかどうかを知る可能性があります。詳細については、こちらをご覧ください。