想看吐槽的點鏈接:
一步步走來的消息推送
一、為啥會有OnePush
消息推送,在國內,要么自己做,要么集成第三方的sdk,現在第三方推送的sdk,有很多可以選擇,友盟,極光,小米等,我們在選擇消息推送的時候,肯定是需要一個能及時把消息推送給用戶的sdk,那么問題來了,很多國產手機廠商都各自根據android修改的UI系統,各種的進程清理,導致消息推送的后臺無法存活,特別是小米、華為的手機上,只要用戶清理,基本上推送后臺服務就死絕了,當然這個也不能怪人家手機廠商,主要是手機上的app,基本上每個app都有自己的后臺推送服務,而且有的流氓程序,甚至還附加了很多其他的后臺服務,這樣就會導致用戶手機耗電、卡頓,手機廠商為了解決既不耗電,也能及時收到消息通知,就推出了自己的推送SDK,比如小米,華為,魅族。如果你的app集成了該廠商的消息推送sdk,那么在該廠商手機上,就屬于系統的級別的服務,就算手機被一鍵清理掉,消息還是能準時的推送到用戶的手機上,但是在國內,生產手機的廠家不不止一個,而且每家都有自己的消息推送,如何做到快速的接入和切換推送呢?那么OnePush,就是解決根據不同的廠商手機,集成不同的推送,從而保證消息的及時送達,目前OnePush提供的小米推送,華為推送的實現,如果你還需要使用其他推送SDK,最多寫兩個類,就可以輕松接入OnePush。
二、怎么集成和使用OnePush
- 添加依賴
dependencies {
compile 'com.peng.library:one-push-core:1.0.1'
compile 'com.peng.library:one-push-huawei:1.0.1'
compile 'com.peng.library:one-push-xiaomi:1.0.1'
compile 'com.peng.library:one-push-umeng:1.0.1'
}
- 繼承BaseOnePushReceiver重寫里面的方法,并在AndroidManifest.xml中注冊
<receiver android:name="com.peng.openpush.TestPushReceiver">
<intent-filter>
<action android:name="com.peng.one.push.ACTION_RECEIVE_NOTIFICATION" />
<action android:name="com.peng.one.push.ACTION_RECEIVE_NOTIFICATION_CLICK" />
<action android:name="com.peng.one.push.ACTION_RECEIVE_MESSAGE" />
<action android:name="com.peng.one.push.ACTION_RECEIVE_COMMAND_RESULT" />
</intent-filter>
</receiver>
- 在AndroidManifest.xml的application標簽下,添加第三方推送實現類
<!--如果引入了one-push-huawei類庫-->
<meta-data
android:name="OnePush_HuaWei_102"
android:value="com.peng.one.push.huawei.HuaweiPushClient" />
<!--如果引入了one-push-xiaomi庫-->
<meta-data
android:name="OnePush_XiaoMi_101"
android:value="com.peng.one.push.xiaomi.XiaomiPushClient" />
<!--如果引入了one-push-umeng庫-->
<meta-data
android:name="OnePush_UMENG_103"
android:value="com.peng.one.push.umeng.UMengPushClient" />
關于<meta-data/>標簽書寫規則:
- android:name 必須是以“ OnePush ”開頭,并且以"_"進行分割(OnePush_平臺名稱_平臺標識碼),在初始化OnePush 的時候,根據標識碼和當前手機系統,動態的使用不同平臺消息推送。
- android:value 這個是繼承IPushClient實現類,全類名路徑。
- 添加第三方AppKey和AppSecret
如果使用了one-push-xiaomi,那么需要在AndroidManifest.xml添加小米的AppKey和AppSecret(注意下面的“\ ”必須加上,否則獲取到的是float而不是String,就會導致id和key獲取不到正確的數據)
<meta-data
android:name="MI_PUSH_APP_ID"
android:value="\ 2215463567096567312" />
<meta-data
android:name="MI_PUSH_APP_KEY"
android:value="\ 9889423330043400" />
<!--umeng_push需要進行下面配置-->
<meta-data
android:name="UMENG_APPKEY"
android:value="593e2640b27b0a0852000014"/>
<meta-data
android:name="UMENG_MESSAGE_SECRET"
android:value="b765e337eedd391603550eb6f922f81b"/>
- 如果OnePush使用了小米推送,需要注冊小米推送權限
<!--注意下面的必須修改 -->
<permission
android:name="com.peng.one.push.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />
<!--這里com.peng.one.push改成你的app的包名,以build.gralde中的applicationId為準-->
<uses-permission android:name="com.peng.one.push.permission.MIPUSH_RECEIVE" />
<!--這里com.peng.one.push改成你的app的包名,以build.gralde中的applicationId為準-->
- 初始化OnePush
//初始化的時候,回調該方法,可以根據platformCode和當前系統的類型,進行注冊
//返回true,則使用該平臺的推送,否者就不使用
OnePush.init(this, new OnOnePushRegisterListener() {
@Override
public boolean onRegisterPush(int platformCode, String platformName) {
//platformCode和platformName就是在<meta/>標簽中,對應的"平臺標識碼"和平臺名稱
//華為手機使用華為推送,其他手機使用小米推送
if (RomUtils.isHuaweiRom() && platformCode == 102) {
Log.i(TAG, "onRegisterPush: 華為推送");
return true;
} else if (platformCode == 101) {
Log.i(TAG, "onRegisterPush: 小米推送");
return true;
}
return false;
}
});
- 關于添加其他消息推送SDK具體操作(如果你不滿足OnePush提供的小米、華為推送,可根據下面步驟,將其他廠商提供的推送,添加到OnePush里面)
創建XXXClient 實現IPushClient接口,并且重寫對應的方法,initContext(Context),會在初始化的使用進行調用,可以在這里進行獲取第三方推送注冊需要的ID,KEY或者其他操作,第三方推送ID、KEY,建議在AndroidManifest.xml中的Application標簽下添加<meta/>,然后在initContext(Context)中進行獲取。
創建和重寫三方消息推送的Receiver或者IntentService(一般第三方會讓你繼承他的receiver,這里指的就是他),重寫三方推送的的接收透傳消息和通知的方法,調用OneRepeater的transmitXXX方法,將通知、透傳消息、通知點擊事件、以及其他事件,轉發到OnePush。
記得在OnePush注冊的時候,進行消息推送平臺的選擇。
具體操作方法:詳見one-push-xiaomi
三、相關api介紹
<h6 align = "left">OnePush詳細api</h6>
方法名稱 | 描述及解釋 |
---|---|
init(Context , OnOnePushRegisterListener) | 初始化OnePush,建議在Application中onCreate()方法 |
register() | 注冊消息推送 |
unregister() | 取消注冊消息推送 |
bindAlias(String) | 綁定別名 |
unBindAlias(String) | 取消綁定別名 |
addTag(String) | 添加標簽 |
deleteTag(String) | 刪除標簽 |
getPushPlatFormCode() | 獲取推送平臺code(AndroidManifest.xml中<meta/>注冊) |
getPushPlatFormName() | 獲取推送平臺name(AndroidManifest.xml中<meta/>注冊) |
setDebug(boolean) | 設置是否為debug模式 |
</br>
<h6 align = "left">OneRepeater詳細api</h6>
方法名稱 | 描述及解釋 |
---|---|
transmitCommandResult(Context,int,int,String,String,String) | 轉發操作反饋(具體type在OnePush.TYPE_XXX) |
transmitMessage(Context,String,String,Map<String,String>) | 轉發透傳消息 |
transmitNotification(Context,int,String,String,Sting,Map<String,String>) | 轉發通知 |
transmitNotificationClick(Context,int,String,String,Sting,Map<String,String>) | 轉發通知點擊事件 |
四、OnePush消息推送測試
OnePush提供一個Java服務端消息推送的示例,大家可以使用它進行消息推送的測試。
五、使用注意
- BaseOnePushReceiver中的onReceiveNotification()方法,在使用的華為推送的時候,該方法不會被調用,因為華為推送沒有提供這樣的支持。
- BaseOnePushReceiver中的onReceiveNotificationClick()方法,在使用華為推送的時候,雖然華為支持,但是如果app被華為一鍵清理掉后,收到通知,那么點擊通知是不會調用華為推送的onEvent()方法,那么如果我們這里轉發,onReceiveNotificationClick()是不會收到的。
- 為了解決華為推送,在手機上被清理掉后,onReceiveNotificationClick()不被調用的情況,OnePush在華為推送上,使用跳轉到指定Activity的推送通知,那么服務端必須提供一個Intent序列化的uri,OnePush提供的Java服務端消息推送示例中,已經提供了服務端序列化Intent的uri的實現(詳見:com.peng.one.push.service.huawei.intent.HWPushIntent)。
- 使用OnePushService測試app的時候,需要修改Constant類的第三方推送id,否則將無法推送!當然你也可以使用第三方推送的web后臺。
六、華為推送服務端Intent序列化示例
intent://com.peng.one.push/notification?title=標題&content=通知內容&extraMsg=額外信息&keyValue={"key1":"value1","key2":"value2","key3":"value3"}#Intent;scheme=OnePush;launchFlags=0x10000000;end
七、開源地址
八、附點圖吧,前面太多文字看著太累
小米推送 | 華為推送 | 友盟推送 |
---|---|---|