Почему запуск действия из виджета также приводит к запуску моей основной деятельности? - PullRequest
5 голосов
/ 27 декабря 2010

Когда я запускаю активность из виджета, я хочу, чтобы кнопка «Назад» переходила на домашний экран, но вместо этого она переходит к основной деятельности приложения.После игры, я обнаружил, что, если я как-то закрою основное действие приложения, эта проблема не возникает.Странно.

Я нашел решение здесь , в котором говорится, что вызывать finish ();в моей основной деятельности onPause ().Очевидно, что это неправильное решение, например, переориентация экрана вызывает onPause (), поэтому активность воли прекращается при повороте телефона.

Вот как я начинаю свою деятельность:

@Override
public void onReceive(Context context, Intent intent) {
    [...]
        //new Emergency().emDialog(context).show();
        Intent myIntent = new Intent(context, EmergencyActivity.class);

        // FLAG_ACTIVITY_NEW_TASK is needed because we're not in an activity
        // already, without it we crash.
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(myIntent);

Вы можете увидеть остальную часть кода в http://code.google.com/p/emergencybutton/source/browse

edit: я пытался запустить упражнение по-другому, но все равно он не работает правильно:

Intent myIntent = new Intent();
myIntent.setClassName("com.emergency.button", "com.emergency.button.EmergencyActivity");

Ответы [ 4 ]

8 голосов
/ 27 декабря 2010

Хорошо, поэтому я не совсем уверен, что здесь произошло, но android:launchMode="singleInstance" в активности в AndroidManifest.xml это как-то исправил.

    <activity android:name=".EmergencyActivity"
              android:launchMode="singleInstance"

@ Октавиан - я должен был уточнить, что я запускаюактивность от onReceive в AppWidgetProvider.Я на главном экране, запускаю действие под названием B, но почему-то и A, и B находятся в стеке действий вместо просто B.

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

6 голосов
/ 27 декабря 2010

Хотя я никогда не использовал виджеты, я считаю, что когда вы щелкаете виджет, вы возобновляете существующую задачу.Следовательно, когда вы в этой задаче, вы вернетесь к последней активности в этой задаче (вместо Домашней).

Просмотрите эту ссылку и выберите правильный режим запуска для вашего виджета http://developer.android.com/guide/topics/fundamentals.html#lmodes

1 голос
/ 27 декабря 2010

Поведение не странное, просто работает Android.Стек активности просто отслеживает все действия.Теперь, когда вы запускаете действие A, которое запускает другое действие B, ваш стек выглядит следующим образом (B, A).Если вы нажмете клавишу «Назад», то операция B будет вытолкнута из стека, и А снова будет выведен на передний план.

Правильное решение - просто вызвать finish() сразу после запуска1004 *.

0 голосов
/ 03 декабря 2014

Иногда по каким-либо причинам невозможно использовать launchMode singleInstance в приложении.В этом случае вы должны начать свою деятельность и очистить стек активности.Вы можете архивировать это, используя флаги.Вот пример:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...