【问题标题】:Start fragment from notification without restarting activity从通知开始片段而不重新启动活动
【发布时间】:2015-06-22 17:36:04
【问题描述】:

标题很好地解释了我的问题。我有一个正在运行的活动,当应用程序发送通知时,我想更改我已经运行的活动中的活动片段。如果在任何时候调用MainActivity.onDestroy,那么就出了问题。

Google Play 商店应用演示了我的问题解决方案的一个示例。当 Play 商店在后台打开并且另一个应用/通知打开 Play 商店应用时,Play 商店会打开您打开的最后一个片段,然后继续加载新片段,但不会重新启动 Activity。

我尝试了几种解决方案,例如:

viewContactsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
viewContactsIntent.setAction(Intent.ACTION_MAIN);
viewContactsIntent.addCategory(Intent.CATEGORY_LAUNCHER);

并将android:launchMode="singleTop 添加到清单中的 MainActivity 标记。

到目前为止还没有任何工作。

谢谢。

编辑:

深入了解用于构建我的通知的代码。

Class viewContacts  = MainActivity.class;
Intent viewContactsIntent   = new Intent(context, viewContacts);
TaskStackBuilder sbViewContacts   = TaskStackBuilder.create(context);
sbViewContacts.addParentStack(viewContacts).addNextIntent(viewContactsIntent);
int piFlag = PendingIntent.FLAG_UPDATE_CURRENT;
PendingIntent piViewContacts  = sbViewContacts.getPendingIntent(0, piFlag);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setContentIntent(piViewContacts);

收到电话后,此通知会从 PhoneStateListener 中发送。

【问题讨论】:

    标签: android android-fragments android-intent android-notifications


    【解决方案1】:

    只需将活动的启动模式设置为单个实例:

    android:launchMode="singleInstance"
    

    并在没有设置任何自定义标志的情况下调用 startActivity。

    现在,如果正在启动的 Activity 已经在运行,它将被带到最前面,并且它的 onNewIntent 将根据您传递给 startActivity 的意图被调用。

    开始一个活动:

    Intent intent = new Intent(this, OtherActivity.class);
    intent.putExtra("is okay", true);
    startActivity(intent);
    

    接收新意图:

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.e(TAG, "Okay: " + intent.getBooleanExtra("is okay", false));
    }
    

    【讨论】:

    • 我正在尝试从通知启动活动,而不是从应用程序内启动。简单地添加android:launchMode="singleInstance" 并不能阻止onDestroy 被调用。
    • @Android 你如何获得 onDestroy 回调?关闭应用?
    • 我的应用程序在MainActivity.class 上运行,当我构建通知时,我setContentIntent 带有一个包含new Intent(context, MainActivity.class) 的待处理意图。当我收到通知时,我按下通知并调用MainActivity.onDestroy 并调用new Intent(context, MainActivity.class)。我不是打电话给onDestroy,而是Android系统。
    • @Android 我不明白你在说什么。发布您如何通知以及如何“接收”通知的代码。
    • 我已经添加了构建通知的代码。我将很快添加显示通知的代码。
    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2016-09-20
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多