4

デフォルトの Android ランチャーでは、別のアクティビティ中にホームを押すと、ランチャーが起動します。ランチャーでもう一度ホームを押すと、デフォルトのホーム画面ページにリセットされます。これがどのように行われるのかわかりません。Android は、ランチャーがフォアグラウンドにあるかどうかにかかわらず、同じインテントを送信します。ホーム キーもユーザー アプリによって傍受できません。

これを達成する方法はありますか?

4

2 に答える 2

12

Android は、ランチャーがフォアグラウンドにあるかどうかにかかわらず、同じインテントを送信します。

正しい。

ホーム キーもユーザー アプリによって傍受できません。

正しい。

これがどのように行われるのかわかりません。

への呼び出しstartActivity()によってIntentがアクティビティの既存のインスタンスに配信される場合、新しいインスタンスは (定義により) 作成されず、既存のインスタンスは のonNewIntent()代わりに で呼び出されますonCreate()

ホーム画面の場合、通常、真にホーム画面であるアクティビティ、次のようにマニフェストでandroid:launchMode="singleTask"またはを使用します。android:launchMode="singleInstance"

    <activity
        android:name="Launcher"
        android:launchMode="singleTask"
        android:clearTaskOnLaunch="true"
        android:stateNotNeeded="true"
        android:theme="@style/Theme"
        android:screenOrientation="nosensor"
        android:windowSoftInputMode="stateUnspecified|adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME"/>
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.MONKEY" />
        </intent-filter>
    </activity>

( AOSP の古いランチャーから)

次に、アクティビティを実装onNewIntent()して何かを行うことができます。前述の古いランチャーの場合、次のものonNewIntent()含まれます

            if (!mWorkspace.isDefaultScreenShowing()) {
                mWorkspace.moveToDefaultScreen();
            }

これはおそらく、ユーザーがホーム画面アクティビティによって管理される一連の画面内の他の画面を現在表示している場合、UI をアニメーション化してデフォルト画面に戻します。

. onNewIntent()_ android:launchMode_ startActivity()_ Intent_ FLAG_ACTIVITY_REORDER_TO_FRONT_

于 2012-11-02T22:21:37.120 に答える
5

より具体的には、

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=
            Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) {
        goHome();
    }
}
于 2014-02-16T04:58:26.213 に答える