我必须在接收通知时启动应用程序。当应用程序被终止并收到通知时(即条件内的代码),下面的代码可以正常工作。但是当应用程序在前台或后台运行时,会创建多个活动实例(即其他情况下的片段)。接收通知时不是必须启动的MainActivity,而是包含广播接收器的其他一些活动。 我在GCMintentService类的onMessage中添加了以下行。
if (currentPackage.equalsIgnoreCase(context.getPackageName()
.toString())) {
broadcastMessage(context, message);
} else {
Intent mIntent = new Intent(context, MainActivity.class);
mIntent.setAction(Intent.ACTION_MAIN);
mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
}
在活动中,在BroadcastReceiver的onReceive方法下,我再次开始活动。
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
startActivity(getIntent().setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
};
答案 0 :(得分:0)
我的一个申请表中也有这个要求。如果我们打电话
,我们就可以实现Intent mIntent = new Intent(context, MainActivity.class);
mIntent.setAction(Intent.ACTION_MAIN);
mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
broadcastMessage(context, message);
在主要活动中,在接收上述广播消息的广播接收器中使用以下内容。
WakeLock wakeLock = null;
KeyguardManager kgMgr = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
boolean locked = kgMgr.inKeyguardRestrictedInputMode();
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
if (!pm.isScreenOn()) {
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyWakeLock");
wakeLock.acquire();
}
if (locked) {
Window mWindow = getWindow();
mWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
mWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
我个人认为这不是最好的答案,也是最好的想法,当收到通知时直接打开应用程序,因为会有很多功能,如onCreate onResume,会自动触发,破坏用户的工作,如果他们通过直接打开另一个应用程序是一项非常重要的工作,我们也需要放置很多标志或使用任何其他方法来管理应用程序的流程,当用户打开应用程序时,应用程序来自后台,应用程序打开应有通知所有这些情况。避免它,因为它破坏了整个用户体验。