通知打开活动,按回按钮,防止打开堆栈活动?

时间:2011-10-03 21:29:14

标签: android android-activity notifications android-intent back-button

这与my previous question非常相似,因为它是某种跟进。我对给出的唯一解决方案不满意;此外,解决方案是针对与此问题略有不同的问题。那么让我试着再次解释这个问题......

  1. 在启动时创建通知(使用BroadcastReceiver)。
  2. 我的应用主要活动已打开,按下主页按钮(活动将被发送到后台)。
  3. 我按下状态栏并按下之前在启动时创建的通知。
  4. 这将开始一些与主要活动不同的活动。
  5. 按下后退按钮,显示主要活动。
  6. 这和我之前的问题没什么不同......事实是,“主要活动”只是一个例子。我可以打开应用程序主活动,然后通过菜单选项打开about活动并按下主页按钮。后面的堆栈现在是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 个答案:

答案 0 :(得分:4)

在做了一些阅读之后,也许这就是你需要的旗帜组合:

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

我认为这应该强制你的SomeActivity类在一个全新的任务中启动。

答案 1 :(得分:-1)

从通知启动Activity时,您可以控制将要打开的Activity如何放在后台堆栈中,以及它与Intent标志关联的任务。您可以尝试以下方式:

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

如果这不起作用,请尝试设置一些other flags,直到获得所需的行为。

答案 2 :(得分:-1)

您是否希望将MainActivity留在历史中?如果没有,那么我的简单粗略的解决方案是在暂停时完成MainActivity。 (在MainActivity中调用此方法)

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

这将确保您在远离它时远离历史记录删除MainActivity,并且在按下后退按钮时将永远不会显示。 这也可以用于AboutActivity。