Панель запуска Android: нажмите «Домой» в панели запуска, чтобы перейти к экрану по умолчанию.

В стандартной программе запуска Android нажатие кнопки «Домой» во время другого действия запустит программу запуска. Повторное нажатие кнопки «Домой» в панели запуска приведет к сбросу на страницу домашнего экрана по умолчанию. Я не понимаю, как это можно сделать. Android отправляет одно и то же намерение независимо от того, находится ли панель запуска на переднем плане или нет. Ключ Home также не может быть перехвачен пользовательскими приложениями.

Есть ли способ добиться этого?


person kevdliu    schedule 02.11.2012    source источник


Ответы (2)


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();
            }

Это, предположительно, анимирует пользовательский интерфейс обратно к экрану по умолчанию, если пользователь в настоящее время просматривает какой-либо другой экран в наборе экранов, управляемых действием домашнего экрана.

Другой подход к запуску onNewIntent() вместо использования android:launchMode состоит в том, чтобы делать это выборочно при вызове startActivity(), включая соответствующие флаги в Intent, такие как FLAG_ACTIVITY_REORDER_TO_FRONT.

person CommonsWare    schedule 02.11.2012
comment
Спасибо большое за информацию. Я попробовал другой подход для запуска onNewIntent(), добавив FLAG_ACTIVITY_REORDER_TO_FRONT с FLAG_ACTIVITY_SINGLE_TOP и без него, но onNewIntent() не запускается. Есть что-то, чего мне не хватает? Спасибо - person kevdliu; 03.11.2012
comment
@kevdliu: Хммм... тогда попробуйте комбинацию FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP. Я знаю, что это работает, так как я использую его в некоторых своих примерах приложений NFC для передачи события тега NFC в текущую активность (вместо запуска другой копии). Я думал, что FLAG_ACTIVITY_REORDER_TO_FRONT будет иметь тот же эффект. Имейте в виду, что onNewIntent() будет вызываться только в том случае, если действие уже существует — если вы использовали finish() или кнопку НАЗАД, чтобы избавиться от действия, ему придется создать новое и вызвать onCreate(), а не onNewIntent(). - person CommonsWare; 03.11.2012
comment
Спасибо за ответ. Я принял ваш ответ, потому что он ответил на мой первоначальный вопрос. Но я на самом деле пытаюсь закодировать приложение для запуска домашнего экрана, которое имитирует поведение запуска домашней клавиши. Если вы можете помочь мне, я был бы очень признателен. Я получил намерение запуска для домашнего экрана с помощью getLaunchIntentForPackage(), добавил флаги и startactivity(). Однако onNewIntent() средства запуска не вызывается. - person kevdliu; 04.11.2012
comment
@kevdliu: Тогда вам нужно посмотреть исходный код вашей программы запуска, поскольку я понятия не имею, что она может делать. И, если у вас нет такого исходного кода, вам, вероятно, не повезло. - person CommonsWare; 04.11.2012
comment
Я думаю, что решающим фактором является то, если ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) - person kevdliu; 07.11.2012

чтобы быть более конкретным, сделайте

@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();
    }
}
person Michael Kern    schedule 16.02.2014