个推SDK分析
2016-08-15 本文已影响2257人
戴同学不呆
最近项目中有使用到个推,个推在程序关闭的时候也能收到推送,只有在程序被强制停止后才无法收到推送。
简单分析下个推的原理
先从AndroidManifest入手
PushDemoReceiver 你的接受推送的广播,接受从个推SDK发送的广播
<receiver
android:name="com.getui.demo.PushDemoReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.igexin.sdk.action.你的APPID" /> //手机里可能有好几个App集成个推,通过APPID可以指定发送广播接受
</intent-filter>
</receiver>
PushReceiver 接受系统广播,里面是各种启动PushService的逻辑
在Android4.0以后,系统广播带有FLAG_EXCLUDE_STOPPED_PACKAGES
- 安装但从未启动过的APP不会收到系统广播
- 启动后被强制停止的APP不会收到系统广播
<receiver android:name="com.igexin.sdk.PushReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> //当手机开机的时候,系统发出的广播,接收到后,启动个推服务
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> //网络变化时的广播
<action android:name="android.intent.action.USER_PRESENT" /> //用户锁屏或者解锁达到桌面的广播
<action android:name="com.igexin.sdk.action.refreshls" /> //大概是个推App互相拉起的广播(个推SDK在收到推送后,会拉起别的APP的个推服务)
<!-- 以下三项为可选的action声明,可大大提高service存活率和消息到达速度 -->
<action android:name="android.intent.action.MEDIA_MOUNTED" /> //SD卡安装广播
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> //连接电源广播
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> //断开电源广播
</intent-filter>
</receiver>
下面那些代码混淆的有点厉害,之后再补充
<provider
android:name="com.igexin.download.DownloadProvider"
android:exported="true"
android:authorities="downloads.第三方包名"
android:process=":pushservice" />
<receiver
android:name="com.igexin.getuiext.service.PayloadReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.igexin.sdk.action.7fjUl2Z3LH6xYy7NQK4ni4" />
<action android:name="com.igexin.sdk.action.你的APPID" />
</intent-filter>
</receiver>
<service
android:name="com.igexin.getuiext.service.GetuiExtService"
android:process=":pushservice" />