从 BroadcastReceiver 调用时 startActivity 不工作
startActivity not working when calling from BroadcastReceiver
我有一个通知,当我 select 时,它使用 PendingIntent
将 Broadcast
发送到 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开始哦这是强制性的事情
我有一个通知,当我 select 时,它使用 PendingIntent
将 Broadcast
发送到 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开始哦这是强制性的事情