在使用百度推送的时候,如果有多个应用,并且启动了pushservice服务,当你彻底退出其中一个app,或者长按home键杀掉app之后,这个app将无法收到通知,这是什么原因呢?
实际上通知已经被pushservice收到了,也发出了广播,但只有当pushreceiver收到com.baidu.android.pushservice.action.notification.SHOW 这个广播的时候,才会进行默认的状态栏提示。问题就出在这里,因为android 4.0以后,对于所有广播消息,默认会加上 FLAG_EXCLUDE_STOPPED_PACKAGES 这个flag,所以app彻底退出后,就无法收到通知了。
看下反编译后的代码就知道了:
发送notification广播代码:
Intent intent = new Intent("com.baidu.android.pushservice.action.notification.SHOW");
intent.setPackage(publicmsg.f);
intent.putExtra("public_msg", publicmsg);
intent.putExtra("notify_type", "rich_media");
intent.putExtra("app_id", s1);
intent.putExtra("message_id", s2);
intent.putExtra("pushService_package_name", context.getPackageName());
intent.putExtra("service_name", "com.baidu.android.pushservice.PushService");
context.sendBroadcast(intent);
再看看发送message的广播代码:
发送message广播,注意设置了flasg,并且flag是32,能自动启动stopped应用
Intent intent1 = new Intent("com.baidu.android.pushservice.action.MESSAGE");
intent1.setPackage(e1.a);
intent1.putExtra("message", abyte0);
intent1.putExtra("message_string", new String(abyte0, "UTF-8"));
intent1.setFlags(32);
c.sendBroadcast(intent1);
现在知道了吧,杀掉进程后,能收到消息,却收不到通知,flag 32 就是 FLAG_INCLUDE_STOPPED_PACKAGES,也就是会启动彻底退出的应用以接收消息。
这个问题我已经反馈给百度推送的技术,预计4.3版会加上。