从BroadcastReceiver调用时,startActivity不起作用

时间:2015-02-11 21:15:52

标签: android android-activity android-notifications android-broadcast

我收到通知,当我选择时,会使用BroadcastBroadcastReceiver发送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));

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

3 个答案:

答案 0 :(得分:12)

尝试使用以下标志作为意图。

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

对于待定意图使用PendingIntent.FLAG_UPDATE_CURRENT

答案 1 :(得分:3)

为了从BroadcastReceiver启动活动,你应该添加FLAG_ACTIVITY_NEW_TASK的标志

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

答案 2 :(得分:1)

对于寻找相似问题的人。从Android Q开始,restricted可以在后台运行应用程序时启动任何活动。要启动活动,您需要显示一个带有PRIORITY_HIGH的通知并设置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())

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

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

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