2
ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(5);

これは、実行中のアクティビティを取得するためにホーム画面アプリで使用されるコードです。

HOMEキーを長押しすると、最近使用したアプリのリスト ( という名前のアクティビティを含む)RecentApplicationsActivityが表示されます。しかし、上記のコードの「タスク」にはリストされていません。

なぜこれが機能しないのですか?

4

1 に答える 1

2

Activity ではなく、RecentApplications を表示するダイアログであるためです。そのRecentApplicationsDialogと呼ばれます。コードは AOSP で確認できます。

https://android.googlesource.com/platform/frameworks/base/+/kitkat-release/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java

このダイアログは、WindowManagerService によって管理される PhoneWindowManager によって処理されます。

https://android.googlesource.com/platform/frameworks/base/+/kitkat-release/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

private void handleLongPressOnHome() {

        if (mLongPressOnHomeBehavior < 0) {
            mLongPressOnHomeBehavior
                    = mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);
            if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||
                    mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
                mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
            }
        }

        if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {
            performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);

            // Eat the longpress so it won't dismiss the recent apps dialog when
            // the user lets go of the home key
            mHomeLongPressed = true;
        }

        if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {
            showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
        } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
            try {
                IStatusBarService statusbar = getStatusBarService();
                if (statusbar != null) {
                    statusbar.toggleRecentApps();
                }
            } catch (RemoteException e) {
                Slog.e(TAG, "RemoteException when showing recent apps", e);
                // re-acquire status bar service next time it is needed.
                mStatusBarService = null;
            }
        }
    }

このダイアログを表示するために使用されるコンテキストは、通常のタスクに属していません。代わりに、このダイアログを表示するためにシステム コンテキストが使用されます。

于 2014-06-24T23:37:03.783 に答える