在没有新意图的情况下,我应该如何从通知返回到活动

Posted

技术标签:

【中文标题】在没有新意图的情况下,我应该如何从通知返回到活动【英文标题】:How should i do from notification back to activity without new intent 【发布时间】:2013-08-27 19:40:59 【问题描述】:

来自 android 开发,我通过示例代码实现了一个简单的通知,但是在我的应用程序中,我不想新的意图并再次创建活动,我只想回到我的上一个活动(它是一个媒体播放器 UI )。如果我使用示例代码,它将通过

创建一个新活动
Intent resultIntent = new Intent(this, ResultActivity.class);

我评论了有关新意图的相关代码并收到了通知,但不知道如何回到我的上一个活动...

长按主页键返回我的应用程序并触摸我的应用程序就可以了。 我想要的就是这种行为。

bleow 是来自 Android 开发的示例代码,我评论了新的意图部分。

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("My notification")
    .setContentText("Hello World!");
/*Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
    stackBuilder.getPendingIntent(
        0,
        PendingIntent.FLAG_UPDATE_CURRENT
    );
mBuilder.setContentIntent(resultPendingIntent);*/
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(mId, mBuilder.build());

[更新]

我认为我需要为活动的意图和属性设置标志。 因此,对于我想回到我设置的活动

android:launchMode="singleInstance"

因为,我不想要一个来自意图的新活动,我只想要我的最后一个活动,所以我添加了

Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

从文档中我了解到,使用 Pendingintent.contentIntent 它必须包含 FLAG_ACTIVITY_NEW_TASK 标志,并且在使用此标志时,如果任务已经在为您现在的活动运行启动,则不会启动新的活动;相反,当前任务将简单地以其上次所处的状态被带到屏幕的前面。所以我还添加了

Intent.FLAG_ACTIVITY_NEW_TASK

但是从 logCat 中,我仍然看到,当我触摸返回活动的通知时,pendingintent 仍然调用 onCreate() 函数,而不是仅仅显示仍然“活着”的最后一个活动。

【问题讨论】:

我从***.com/questions/2424488/… 得到了解决方案,但没有运气:( 【参考方案1】:

如果你想从后台调用 Activity,试试这个:

    Intent intent = new Intent(this, YourLauncherActivity.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            intent, 0);
    mBuilder.setContentIntent(pendingIntent);

如果您在主屏幕上单击通知,则您的应用程序的最后显示的 Activity 将进入前台,而无需重新启动它。如果 Activity 被系统杀死,你会得到一个新的 Activity。

【讨论】:

但是以这种方式支持的活动将与我的原始应用程序分离:(即活动(A)->活动(B)同时为B做PendingIntent。当我从通知,我不能再回到A了... 这很奇怪。你还在用android:launchMode="singleInstance"吗? 是的。我没有修改那个。我需要为 PendingIntent 中使用的这个 Activity 设置 parentActivity 吗? 我为我的 minSDKVersion 但没有运气,然后尝试添加 TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(ResultActivity.class); stackBuilder.addNextIntent(resultIntent);但仍然没有运气...这种情况链接***.com/questions/13632480/… 无论如何,再次感谢您的大力帮助。我认为这是我需要解决的另一个问题:)【参考方案2】:

我使用了 PendingIntent.getActivities 而不是 getActivity。这在我的项目中运行良好。

Intent backIntent = new Intent(this, HomeActivity.class);
                backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent notificationIntent = new Intent(this, NextActivity.class);

                final PendingIntent pendingIntent = PendingIntent.getActivities(this, 1,
                        new Intent[] backIntent, notificationIntent, PendingIntent.FLAG_ONE_SHOT);

【讨论】:

【参考方案3】:

对我来说,这很有效:

.setContentIntent(
     PendingIntent.getActivity(
     context,
     0,
     new Intent(context, YOUR_MAIN.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP ),PendingIntent.FLAG_ONE_SHOT))   

FLAG_ONE_SHOT:不要创建两次(与 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)

【讨论】:

【参考方案4】:

SingleTop模式下,我使用这个方法没有明确定义根活动类:

Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
.setComponent(getPackageManager().getLaunchIntentForPackage(getPackageName()).getComponent());

这将从通知中恢复上次活动:

builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));

或者这样从服务中恢复上一个活动:

try 
    PendingIntent.getActivity(this, 0, intent, 0).send();
 catch (CanceledException e) 
    e.printStackTrace();

【讨论】:

【参考方案5】:

代码听到

        Intent resultIntent = new 
 Intent(getApplicationContext(),MainActivity.class);

        resultIntent.putExtra("splash",2);
        resultIntent.putExtra("message","beacons");
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntentWithParentStack(resultIntent);
        resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent notifyPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        notificationCompatBuilder.setContentIntent(notifyPendingIntent);

    Intent intent = this.getIntent();
    Bundle extras = intent.getExtras();

    if (extras != null) 
        String extraValue = extras.getString("notificationType");

        if(extraValue !=null)
            int value = Integer.parseInt(extraValue);
            if (value == 1) 
                intent = new Intent(SplashActivity.this,MainActivity.class);
                intent.putExtra("splash",value);
                intent.putExtra("message", "fromsplash");
                startActivity(intent);
                finish();
             else
             if (value == 2)
                 intent = new Intent(SplashActivity.this,MainActivity.class);
                 intent.putExtra("swip","2");
                 intent.putExtra("message", "beacons");
                startActivity(intent);
                finish();
             
         

     

【讨论】:

以上是关于在没有新意图的情况下,我应该如何从通知返回到活动的主要内容,如果未能解决你的问题,请参考以下文章

如何处理通知中的待处理意图

如何在创建后通过更改活动来处理推送通知意图?

返回堆栈和意图标志不起作用

意图 - 如果活动正在运行,请将其放在前面,否则启动一个新活动(来自通知)

如何将 PendingIntent 用于两个不同的活动?

如何从 Google Play 服务通知中检测意图