当点击正在进行的通知时返回先前的活动

4

我正在使用一些EditText和一个Ongoing Notification进行活动。

在填写EditText后,通过按Home按钮回到主屏幕(我的应用程序在后台运行)。我想要的是当我点击持续通知时,回到具有填充EditText的我的活动(而不是创建新的活动)。

我尝试过这个:

如何从通知返回活动而不使用新意图

还有这个:

通知单击:已打开的活动

它们根本不起作用!!!

下面是我的代码片段:

ProtocolMonitorActivity.java

    Intent resultIntent = new Intent(this, ProtocolMonitorActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(ProtocolMonitorActivity.class);
    stackBuilder.addNextIntent(resultIntent);

    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
            PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder notiBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.noti_icon)
            .setContentTitle("Protocol Monitor App")
            .setContentText("Service is running")
            .setOngoing(true);
    notiBuilder.setContentIntent(resultPendingIntent);

    notiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notiManager.notify(notiId, notiBuilder.build());

清单文件

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".ProtocolMonitorActivity"
        android:label="@string/app_name"
        android:process="com.android.phone"
        android:launchMode="singleTop"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
        </intent-filter>

        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".ProtocolMonitorActivity" />

    </activity>
</application>

有人对此有任何想法吗?

非常感谢!!!

3个回答

10

使用TaskStackBuilder无法实现此操作。 TaskStackBuilder的行为是始终清除任务(重新创建任何活动)。

您只需要一个“启动Intent”将您的任务带到前台,无论它处于什么状态。 有两种方法可以实现这个目标:

变体1:

final Intent notificationIntent = new Intent(this, ProtocolMonitorActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

变体2:

final Intent notificationIntent = 
        PackageManager.getLaunchIntentForPackage(getPackageName());

接着执行:

PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0,
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder notiBuilder = new NotificationCompat.Builder(
        this).setSmallIcon(R.drawable.noti_icon)
        .setContentTitle("Protocol Monitor App")
        .setContentText("Service is running")
        .setOngoing(true);
notiBuilder.setContentIntent(resultPendingIntent);

notiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notiManager.notify(notiId, notiBuilder.build());

@Viet-AnhDinh 你好,我也遇到了同样的问题。这种方式只有在关闭应用程序时才有效。但是当活动已经打开时,它会重新启动。如何在不使用SingleTask模式的情况下解决它? - AnswerZhao
@AnswerZhao,那不是真的。这个解决方案只是将现有任务带回前台,无论它处于什么状态。它不会重新开始任何东西。如果您有特定问题,应该发布一个新问题,而不是在现有答案上发表评论。这样可以获得更多关注。 - David Wasser
1
尊敬的先生,我很爱您,即使我已经阅读了官方文档,但我仍然无法实现这个。谢谢。 - Abdul Salam

1
只需插入此行。
resultIntent.setAction(Intent.ACTION_MAIN);

谢谢!我需要先移除TaskStackBuilder。 - Viet-Anh Dinh

-1
在所需的活动中,在清单文件中的活动标签中设置 android:launchMode="singleTop"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接