进程不在,为何能收到PUSH?

来源:互联网 发布:下载淘宝网商城 编辑:程序博客网 时间:2024/05/22 13:00

          以小米4手机MIUI8系统为例, 按HOME键杀掉钉钉、微信进程后。 执行adb shell ps命令查看, 确认没有微信和钉钉的后台进程。 

1、使用其它手机向该机发送微信和钉钉消息, 在通知栏里能看到钉钉的通知, 但是没有微信的。

2、再次执行adb shell ps命令, 仍然没有钉钉和微信的进程信息。


     为什么钉钉能收到推送, 而微信却不能? 

09-26 09:31:14.480 W/PushService( 2672): 2017-09-26 09:31:14,479 - [WARN::PushService] - [Thread:96] receive a message, appid=2882303761517296732, msgid= slm06b21506389472573tv09-26 09:31:14.511 W/JavaCalls( 2672): Meet exception when call Method 'setGroup' in android.app.Notification$Builder@ad1560c09-26 09:31:14.511 W/JavaCalls( 2672): java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isInterface()' on a null object reference09-26 09:31:14.511 W/JavaCalls( 2672): at java.lang.Class.isAssignableFrom(Class.java:545)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.channel.commonutils.reflect.JavaCalls.compareClassLists(JavaCalls.java:213)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.channel.commonutils.reflect.JavaCalls.findMethodByName(JavaCalls.java:190)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.channel.commonutils.reflect.JavaCalls.getDeclaredMethod(JavaCalls.java:169)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.channel.commonutils.reflect.JavaCalls.callMethodOrThrow(JavaCalls.java:147)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.channel.commonutils.reflect.JavaCalls.callMethod(JavaCalls.java:132)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.MIPushNotificationHelper.getNotificationForLargeIcons(MIPushNotificationHelper.java:392)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.MIPushNotificationHelper.notifyPushMessage(MIPushNotificationHelper.java:143)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.MIPushEventProcessor.postProcessMIPushMessage(MIPushEventProcessor.java:349)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.MIPushEventProcessor.processMIPushMessage(MIPushEventProcessor.java:204)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.MIPushEventProcessor.processNewPacket(MIPushEventProcessor.java:83)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.ClientEventDispatcher.notifyPacketArrival(ClientEventDispatcher.java:132)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.PacketSync.handleBlob(PacketSync.java:177)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.PacketSync.onBlobReceive(PacketSync.java:110)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.XMPushService$BlobReceiveJob.process(XMPushService.java:1445)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.XMPushService$Job.run(XMPushService.java:1386)09-26 09:31:14.511 W/JavaCalls( 2672): at com.xiaomi.push.service.JobScheduler$SchedulerImpl.run(JobScheduler.java:405)09-26 09:31:14.524 W/PushService( 2672): 2017-09-26 09:31:14,522 - [WARN::PushService] - [Thread:96] try send mi push message. packagename:com.alibaba.android.rimet action:AckMessage09-26 09:31:14.524 D/StatusBar( 1773): onNotificationPosted:  Key: 0|com.xiaomi.xmsf|1335515202|null|10094 GroupKey: 0|com.xiaomi.xmsf|1335515202|null|10094 Connected: true09-26 09:31:14.526 D/StatusBar( 1773):  GroupChild: false  GroupsContainsKey: false  IsUpdate: true IsGroupSummary: false hasIcon: true09-26 09:31:14.527 D/PhoneStatusBar( 1773): updateNotification pkg=com.alibaba.android.rimet;id=1335515202

         通过打印日志发现, MIUI系统实现了推送功能, com.alibaba.android.rimet是阿里钉钉的包名。 我推理猜测阿里钉钉跟小米进行了合作, 当没启动钉钉进程时, 钉钉服务器将消息转给小米服务器, 小米后台将消息推送到手机。 日志中没有微信的内容, 说明微信没适配小米的推送服务。

        点击微信图标启动应用后, 可以收到消息。 查询微信进程, 可以看到微信使用remote多进程的方式。如果添加了白名单,按home键杀进程时只会干掉其中的UI进程:appbrand0, 其它4个进程还在。



推断app进程不启动收PUSH的方法:

1、手机厂商添加白名单, 即可用进程可用后台常驻;  ---- 常规套路,需要跟厂商谈。

2、家族式兄弟app代理收推送;  ---- 大公司的手法

3、app适配手机系统, 就像上面MIUI那样。 ---  仅限于支持PUSH的系统版本

4、极光、个推等PUSH服务商跟各家手机厂商合作。