Уведомление открывает активность, нажмите кнопку «назад», запретить открытие активности стека? - PullRequest
1 голос
/ 04 октября 2011

Это выглядит очень похоже на мой предыдущий вопрос , потому что это своего рода продолжение.Я был не очень доволен единственным решением;Кроме того, решение было немного отличается от этой проблемы.Итак, позвольте мне попытаться объяснить проблему еще раз ...

  1. При загрузке создается уведомление (с BroadcastReceiver).
  2. Открывается основное действие моего приложения и домашняя страницанажата кнопка (активность будет отправлена ​​в задний стек).
  3. Я опускаю строку состояния и нажимаю на уведомление, созданное ранее при загрузке.
  4. Это запустит некоторую активность, другуюот основного.
  5. Я нажимаю кнопку "Назад", и отображается основное действие.

Это не очень отличается от моего предыдущего вопроса ... Дело в том, "основнойактивность "был просто примером.Я мог бы открыть основной вид деятельности приложения, а затем открыть пункт об активности через пункт меню и нажать кнопку «Домой».Задний стек теперь будет MainActivity »AboutActivity.Это означает, что когда кнопка «Назад» нажата во время «некоторого действия» (запускаемого нажатием на уведомление), мы окажемся на вершине заднего стека, то есть, об операции.

Что в основномхочу запретить открытие любой другой активности, когда я нажимаю кнопку «Назад», когда находится в «некоторой активности» (опять же, запускается нажатием на уведомление).Я хочу, чтобы меня привели именно туда, где я был, это может быть активность на рабочем столе или в каком-то другом приложении, но не в приложениях MainActivity и AboutAcitivity моего приложения, потому что это не то место, где я был, они были в заднем стеке, "спали" вфон.

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

Во всяком случае, это мое предлагаемое решение:

// I use this class for public static (or public static final) members and
// methods

public final class AppHelper {
    public static final String KEY_RESUME_FROM_NOTIFICATION = "resumeFromNotification";

    private static boolean sResumeFromNotification = false;

    public static boolean getResumeFromNotification() {
        return sResumeFromNotification;
    }

    public static void setResumeFromNotification(boolean resumeFromNotification) {
        sResumeFromNotification = resumeFromNotification;
    }
}

public class MainActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        (...)
    }

    @Override
    protected void onResume() {
        super.onResume();

        if(AppHelper.getResumeFromNotification()) {
            AppHelper.setResumeFromNotification(false);
            moveTaskToBack(true);
        }
    }

}

public class AboutActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        (...)
    }

    @Override
    protected void onResume() {
        super.onResume();

        if(AppHelper.getResumeFromNotification()) {
            AppHelper.setResumeFromNotification(false);
            moveTaskToBack(true);
        }
    }

}

public class SomeActivity extends Activity {

    // This will be called when the notification is pressed and the activity is
    // not opened yet

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        (...)

        extractIntentExtras(intent);
    }

    // This will be called if the activity is already opened and the
    // notification is pressed

    @Override
    protected void onNewIntent(Intent intent) {
        extractIntentExtras(intent);
        super.onNewIntent(intent);
    }

    private void extractIntentExtras(Intent intent) {
        Bundle bundleExtras = intent.getExtras();

        if(bundleExtras != null) {
            // These intent extras are set on the Intent that starts this activity
            // when the notification is pressed

            AppHelper.setResumeFromNotification(bundleExtras.getBoolean(
                AppHelper.KEY_RESUME_FROM_NOTIFICATION));

            mRowId = bundleExtras.getLong(AgendaNotesAdapter.KEY_ROW_ID);
            populateNoteUpdateFields();
        }
    }

}

Я не знаю, но это решение не выглядит для меня очень элегантно (но оно работает, как я ожидаюэто) и я ищу альтернативы или сильные мнения о моем предложенном решении в качестве приемлемого и хорошего решения.Мысли?

Ответы [ 3 ]

4 голосов
/ 05 октября 2011

После прочтения, возможно, вам понадобится комбинация флагов:

Intent intent = new Intent(mContext, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);

Я думаю, это должно заставить ваш класс SomeActivity запускаться в совершенно новой задаче.

0 голосов
/ 01 ноября 2011

Хотите ли вы, чтобы ваш MainActivity оставался в истории? Если нет, то мое простое, грубое решение - завершить MainActivity, когда оно приостановлено. (Назовите это в вашей основной деятельности)

@Override
public void onPause() {
    finish();
}

Это обеспечит удаление вашей MainActivity из истории при удалении от нее и никогда не будет отображаться при нажатии кнопки «Назад». Это также может быть использовано для AboutActivity.

0 голосов
/ 04 октября 2011

При запуске действия из уведомления вы можете контролировать, как действие, которое вы собираетесь открыть, помещается в задний стек и с какой задачей оно связано с флагами намерений.Вы можете попробовать что-то вроде:

Intent intent = new Intent(mContext, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Если это не сработает, попробуйте установить несколько из других флагов , пока не получите желаемое поведение.

...