Это выглядит очень похоже на мой предыдущий вопрос , потому что это своего рода продолжение.Я был не очень доволен единственным решением;Кроме того, решение было немного отличается от этой проблемы.Итак, позвольте мне попытаться объяснить проблему еще раз ...
- При загрузке создается уведомление (с
BroadcastReceiver
). - Открывается основное действие моего приложения и домашняя страницанажата кнопка (активность будет отправлена в задний стек).
- Я опускаю строку состояния и нажимаю на уведомление, созданное ранее при загрузке.
- Это запустит некоторую активность, другуюот основного.
- Я нажимаю кнопку "Назад", и отображается основное действие.
Это не очень отличается от моего предыдущего вопроса ... Дело в том, "основнойактивность "был просто примером.Я мог бы открыть основной вид деятельности приложения, а затем открыть пункт об активности через пункт меню и нажать кнопку «Домой».Задний стек теперь будет 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();
}
}
}
Я не знаю, но это решение не выглядит для меня очень элегантно (но оно работает, как я ожидаюэто) и я ищу альтернативы или сильные мнения о моем предложенном решении в качестве приемлемого и хорошего решения.Мысли?