Android launcher press home in launcher to go to d

2020-06-21 07:23发布

In the default android launcher, pressing home while in another activity will start the launcher. Pressing home again while in the launcher will reset to the default home screen page. I don't understand how this can be done. Android sends the same intent whether the launcher is in the foreground or not. Home key also cannot be intercepted by user apps.

Is there a way to achieve this?

2条回答
够拽才男人
2楼-- · 2020-06-21 07:31

to be more specific, do

@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();
    }
}
查看更多
beautiful°
3楼-- · 2020-06-21 07:41

Android sends the same intent whether the launcher is in the foreground or not.

Correct.

Home key also cannot be intercepted by user apps.

Correct.

I don't understand how this can be done.

If a call to startActivity() will result in the Intent being delivered to an existing instance of the activity, a new instance is not created (by definition) and the existing instance is called with onNewIntent() instead of onCreate().

In the case of a home screen, typically the activity that truly is the home screen will use android:launchMode="singleTask" or android:launchMode="singleInstance" in the manifest, such as:

    <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>

(from an old launcher in the AOSP)

Then, the activity can implement onNewIntent() to do something. In the case of the aforementioned old launcher, its onNewIntent() includes:

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

This, presumably, animates the UI back to the default screen if the user is presently viewing some other screen within the set of screens managed by the home screen activity.

Another approach to trigger onNewIntent(), instead of using android:launchMode, is to do it selectively when you call startActivity(), by including appropriate flags in the Intent, such as FLAG_ACTIVITY_REORDER_TO_FRONT.

查看更多
登录 后发表回答