1

2 つのファイルをフォローする目的を知りたいです。

Frameworks/base/core/java/android/app/IActivityWatcher.aidl
[説明: アクティビティを介したユーザーのトラバーサルを監視するためのコールバック インターフェイス。]

Frameworks/base/core/java/android/app/IProcessObserver.aidl
[説明なし]

ユーザーが特定の時間帯 (たとえば、午前 10 時から午後 4 時まで) に実行できるアプリを決定できるアプリを構築しようとしています。
ユーザーが指定したアプリが起動した場合、アプリに通知を受け取る方法はありますか? このようにして、アプリは kill コマンドを送信できます (root アクセスが利用可能であると想定しています)。

4

1 に答える 1

1

IActivityWatcherJellyBeanから削除されたようですがActivity、フォアグラウンドで実行されているものを監視するにはIProcessObserver、次のように使用できます。

mActivityManagerNative = ActivityManagerNative.getDefault();
if (mActivityManagerNative != null) {
    try {
        mActivityManagerNative.registerProcessObserver(mProcessObserver);
    } catch (RemoteException e) {
        Log.e("TAG", "onCreate() RemoteException!");
    }
 }

private IProcessObserver.Stub mProcessObserver = new IProcessObserver.Stub() {
    @Override
    public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
       doWhatUWantHere();
    }

    @Override
    public void onImportanceChanged(int pid, int uid, int importance) {
    }

    @Override
    public void onProcessDied(int pid, int uid) {
    }
};

PS 次のコード スニペットを使用して、フォアグラウンドで実行されているアクティビティのパッケージ名を取得できます。

private String getForegroundPackage() {
    ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    List<RecentTaskInfo> taskInfo = am.getRecentTasks(1,
            ActivityManager.RECENT_IGNORE_UNAVAILABLE);
    return taskInfo.isEmpty()
            ? null : taskInfo.get(0).baseIntent.getComponent().getPackageName();
}
于 2013-06-28T01:53:41.653 に答える