从BroadcastReceiver调用时,startActivity不起作用

use*_*234 6 android android-notifications android-activity android-broadcast

我有一个通知,当我选择时,它会发送Broadcast一个BroadcastReceiver使用a PendingIntent.在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));
Run Code Online (Sandbox Code Playgroud)

的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);
Run Code Online (Sandbox Code Playgroud)

Roa*_*ock 12

尝试使用标志如下的意图.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
Run Code Online (Sandbox Code Playgroud)

对于Pending intent,使用PendingIntent.FLAG_UPDATE_CURRENT


Dmi*_*yai 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())
Run Code Online (Sandbox Code Playgroud)

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

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(10);
Run Code Online (Sandbox Code Playgroud)

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