Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android launcher press home in launcher to go to default screen

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?

like image 923
kevdliu Avatar asked Dec 03 '22 01:12

kevdliu


1 Answers

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.

like image 53
CommonsWare Avatar answered May 16 '23 06:05

CommonsWare