当手机里面安装了多个带有百度推送的app之后,我们希望启动其中任意一个app都能将pushservice服务带起来。但是目前有个严重的bug,低版本推送的app启动之后,无法带起推送服务,虽然发了广播,却不起作用,相比仍然是之前那个4.0默认FLAG_EXCLUDE_STOPPED_PACKAGES的原因。
那么如何解决呢?通过反编译代码知道,百度的推送只有当然自己的优先级最高的时候才会带起pushservice,否则一旦发现自己不是最高优先级,便立即finish本服务。优先级是每次initPushService的时候写入push_sync.xml文件中,key为priority2。比如4.1版是384,4.0版是252。
这样,只要我们每次启动app的时候,检查如果没有推送服务,那么找出最高优先级的app,启动之即可。
下面是查找最高优先级app的代码:
public final static String SERVICE_ACTION = "com.baidu.android.pushservice.action.PUSH_SERVICE";
private static String getHighPriorityPackage(Context context) {
Log.d("push", "PushManager.getHighPriorityPackage");
Intent i = new Intent(SERVICE_ACTION);
List<ResolveInfo> localList = context.getPackageManager().queryIntentServices(i, 0);
String myPkgName = context.getPackageName();
String pkgName = "";
long pkgPriority = 0;
for (ResolveInfo info : localList) {
if(!info.serviceInfo.exported) {
continue;
}
String pkg = info.serviceInfo.packageName;
if(!info.serviceInfo.exported) {
continue;
}
Context context1;
try {
context1 = context.createPackageContext(pkg, Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
continue;
}
String spName = new StringBuilder().append(pkg).append(".push_sync").toString();
SharedPreferences sp = context1.getSharedPreferences(spName, Context.MODE_WORLD_READABLE);
long priority = sp.getLong("priority2", 0L);
if(priority > pkgPriority || (myPkgName.equals(pkg) && priority >= pkgPriority)) {
pkgPriority = priority;
pkgName = pkg;
}
Log.d("push", "pkg--" + pkg + ", priority=" + priority);
}
return pkgName;
}
然后就是通过startService来启动这个pkgName所对应app的推送服务了。