从 BroadcastReceiver 调用 startActivity 时无法工作

11
我有一个通知,当我选择它时,它会使用PendingIntentBroadcastReceiver发送一个Broadcast。在onReceive中,我启动一个新的Activity
然而,如果我从最近打开的应用程序中删除我的应用程序(或者通知在抽屉中停留很长时间),则会出现以下情况:
当我在抽屉中有多个通知时,第一个通知可以正常打开。但是,在点击第二个通知后,我的onCreate()onResume()都没有被调用,好像startActivity()根本不起作用。如果我添加标志Intent.FLAG_ACTIVITY_SINGLE_TOP,那么将调用onNewIntent
notificationIntent = new Intent();
notificationIntent.setAction(AppConstants.ACTION_ACTIVITY);
notificationIntent.putExtra("key", value);
int requestID = (int) System.currentTimeMillis();

mBuilder.setContentIntent(PendingIntent
                    .getBroadcast(context, requestID, notificationIntent, 
                                  PendingIntent.FLAG_UPDATE_CURRENT));

onReceive(接收)
  Intent intent = new Intent(context, Activity.class);
  intent.putExtra("key", value);
  //IF I ADD FLAG_ACTIVITY_SINGLE_TOP IT WORKS
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  context.startActivity(intent);

ActivityLAUNCHERMAIN Activity 吗? - ρяσѕρєя K
没有活动是不是“LAUNCHER”。 - user1163234
所以出现了问题。问题解决了还是仍然存在问题? - ρяσѕρєя K
仍未修复。我想要进入一个不是我的启动器的活动。我应该如何定义它,以便我不需要调用 FLAG_ACTIVITY_SINGLE_TOP - user1163234
@user1163234:当您点击第二个通知时,活动是否仍在前台运行?还是在后台运行或完全关闭(已完成)? - Trinimon
@Trinimon 它仍然在前台。但是我的onResume也没有被调用.... - user1163234
4个回答

15
尝试使用以下标志来实现意图。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

对于待处理意图,请使用 PendingIntent.FLAG_UPDATE_CURRENT


当我添加 'Intent.FLAG_ACTIVITY_MULTIPLE_TASK' 时,它会删除应用程序的后退堆栈。有什么解决办法吗? - user1163234
Intent.FLAG_ACTIVITY_MULTIPLE_TASK 挽救了我的生命。 - activesince93

5

对于那些寻找类似问题的人。从Android Q开始,当应用程序在后台时,启动任何活动都是受限制的。要启动您的活动,您需要显示带有PRIORITY_HIGH的通知并设置全屏意图。因此,您应该拥有类似这样的东西:

//Create your intent as usual
Intent intent = new Intent(context, Activity.class);
intent.putExtra("key", value);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

// Build a pending intent 
PendingIntent pIntent = PendingIntent.getActivity(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);

//Notification builder
NotificationCompat.Builder notifyBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(title)
                .setPriority(PRIORITY_HIGH)
                .setFullScreenIntent(pIntent, true /*isHighPriority*/);

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.notify(10, notifyBuilder.build())

这将显示通知并立即启动您的活动。在您的活动onStart()中,您可以像下面这样取消通知:
NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(10);

注意: 不要忘记初始化通道。从Android O开始,这是必须的。


在wear os上使用上述核心,我无法打开应用程序。但是我能够生成通知。有什么建议吗? - SANAT

3
为了从广播接收器启动活动,您应该添加FLAG_ACTIVITY_NEW_TASK标志。
 Intent imap =new Intent(context,MainActivity.class);
                  imap.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  context.startActivity(imap);

1

即使不是启动器,也可以从广播接收器启动活动。这不应该是问题。

尝试传递一个唯一的请求ID,

notificationIntent = new Intent();
notificationIntent.setAction(AppConstants.ACTION_ACTIVITY);
notificationIntent.putExtra("key", value);

mBuilder.setContentIntent(PendingIntent.getBroadcast(context, value, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT));

请看这个问题:

查看此链接


这是我的 requestID: int requestID = (int) System.currentTimeMillis(); - user1163234

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