百度推送 - 低版本无法启动推送服务的解决方法

    当手机里面安装了多个带有百度推送的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的推送服务了。

   

你可能感兴趣的:(android,百度推送)