4

在默认的 android 启动器中,在另一个活动中按 home 将启动启动器。在启动器中再次按主页将重置为默认主屏幕页面。我不明白这是怎么做到的。无论启动器是否在前台,Android 都会发送相同的意图。用户应用程序也无法拦截 Home 键。

有没有办法做到这一点?

4

2 回答 2

12

无论启动器是否在前台,Android 都会发送相同的意图。

正确的。

用户应用程序也无法拦截 Home 键。

正确的。

我不明白这是怎么做到的。

如果调用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 回答