从 BroadcastReceiver 调用时 startActivity 不工作

startActivity not working when calling from BroadcastReceiver

我有一个通知,当我 select 时,它使用 PendingIntentBroadcast 发送到 BroadcastReceiver。在 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));

接收时

  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);

activity 可以从广播接收器启动,即使它不是启动器。那应该不是问题。

尝试传递一个唯一的 requestid,

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

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

看到这个question.

尝试使用如下标志来实现目的。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

对于待定意向使用 PendingIntent.FLAG_UPDATE_CURRENT

为了从 BroadcastReceiver 开始 activity 你应该添加 FLAG_ACTIVITY_NEW_TASK

的标志
 Intent imap =new Intent(context,MainActivity.class);
                  imap.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  context.startActivity(imap);

对于会寻找类似问题的人。从 Android Q 开始是 restricted to launch any activity, when app in background. To launch your activity, you need to displaying a notification with PRIORITY_HIGH and set the full-screen intent。所以,完全你应该有这样的东西:

//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())

这将显示通知并立即启动您的 activity。在您的 activity onStart() 中,您可以关闭如下所示的通知:

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(10);

注意: 不要忘记初始化频道。从Android开始哦这是强制性的事情