Android Q 之后,都不能使用 startActivity 在后台启动了。
详情见:https://developer.android.google.cn/guide/components/activities/background-starts?hl=zh-cn
可以使用fullscreen intent 达到同样的效果。
1 public class NotificationUtils extends ContextWrapper { 2 public static final String TAG = NotificationUtils.class.getSimpleName(); 3 4 public static final String id = "channel_1"; 5 public static final String name = "notification"; 6 private NotificationManager manager; 7 private Context mContext; 8 9 public NotificationUtils(Context base) {10 super(base);11 mContext = base;12 }13 14 @RequiresApi(api = 26)15 public void createNotificationChannel() {16 NotificationChannel channel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH);17 getManager().createNotificationChannel(channel);18 }19 20 private NotificationManager getManager() {21 if (manager == null) {22 manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);23 }24 return manager;25 }26 27 public void sendNotificationFullScreen( String title, String content, String type) {28 if (Build.VERSION.SDK_INT >= 26) {29 createNotificationChannel();30 Notification notification = getChannelNotificationQ31 (title, content, type);32 getManager().notify(1, notification);33 }34 }35 36 public void clearAllNotifiication(){37 NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);38 notificationManager.cancelAll();39 }40 41 public Notification getChannelNotificationQ(String title, String content, String type) {42 Intent fullScreenIntent = new Intent(this, MainActivity.class);43 fullScreenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);44 fullScreenIntent.putExtra("action", "callfromdevice");45 fullScreenIntent.putExtra("type", type);46 PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);47 48 NotificationCompat.Builder notificationBuilder =49 new NotificationCompat.Builder(this, id)50 .setSmallIcon(R.mipmap.ic_logo)51 .setContentTitle(title)52 .setTicker(content)53 .setContentText(content)54 .setAutoCancel(true)55 .setDefaults(Notification.DEFAULT_ALL)56 .setPriority(NotificationCompat.PRIORITY_MAX)57 .setCategory(Notification.CATEGORY_CALL)58 .setFullScreenIntent(fullScreenPendingIntent,true);59 60 Notification incomingCallNotification = notificationBuilder.build();61 return incomingCallNotification;62 }63 64 }
在后台service中调用:
NotificationUtils notificationUtils = new NotificationUtils(MyService.this); String content = "fullscreen intent test"; notificationUtils.sendNotificationFullScreen(getString(R.string.app_name), content, type);
测试的时候发现如果系统通知栏还有应用的通知消息,就只会收到通知,不会弹出页面。需要再弹出页面的时候清空一下之前的通知。
调用以下代码:
NotificationUtils notificationUtils = new NotificationUtils(this);notificationUtils.clearAllNotifiication();
这样每次都可以在Android Q中弹出页面了。
噢。耶。
仅测试一台红米Android Q,不知此方法是否使用所有Android Q 手机