想看吐槽的點(diǎn)鏈接:
android消息推送的好消息:
安卓統(tǒng)一推送標(biāo)準(zhǔn) 已取得階段性成果
實(shí)驗(yàn)室開展基于安卓操作系統(tǒng)統(tǒng)一推送工作的相關(guān)Q&A
小米推送 | 華為推送 | 友盟推送 |
---|---|---|
前言
看了 " 泰爾終端實(shí)驗(yàn)室 "說要統(tǒng)一android的消息推送了松蒜,差點(diǎn)激動的掉眼淚芜繁!
仔細(xì)看了下當(dāng)前的統(tǒng)一推送的進(jìn)度积糯,說實(shí)話躏结,個人感覺真的需要一段時間啊湃累,而且就算將來完成整個統(tǒng)一的推送標(biāo)準(zhǔn)栅干,那么還是會有部分手機(jī)得不到升級嘉栓,還得繼續(xù)時候第三方推送宏榕。不過能至少到時候集成的推送少點(diǎn)了拓诸。
根據(jù)泰爾實(shí)驗(yàn)室的文章,有那么一段麻昼,說要限制透傳消息奠支,個人覺得透傳消息還是很有用的,如果要限制估計還是有點(diǎn)坑抚芦,不知道你是怎么看的倍谜?
問題五:統(tǒng)一推送是否能減少手機(jī)耗電?
目前叉抡,推送消息過程中電量浪費(fèi)一方面來自其自建長連接通道消耗的功耗尔崔,另一方面來自應(yīng)用為接收消息“自啟動”、“相互拉起”等“比烀瘢活”行為造成的資源消耗季春。在建立統(tǒng)一推送的機(jī)制后,推送鏈路將會合并成為一條消返,同時载弄,應(yīng)用不需要為了接收推送消息而“保活”撵颊,從而節(jié)約手機(jī)能耗和系統(tǒng)資源宇攻。
此外,由于應(yīng)用的“日活”數(shù)據(jù)對開發(fā)者和投資人非常重要倡勇,一些開發(fā)者會利用透傳消息逞刷,在用戶不知情的情況下激活應(yīng)用,造成耗電和資源浪費(fèi)妻熊,因此夸浅,透傳消息激活應(yīng)用的做法也會被限制。
快速集成指南
1. 添加OnePush主要依賴(必須添加)
dependencies {
compile 'com.peng.library:one-push-core:1.0.1'
}
2. 添加第三方推送依賴(根據(jù)自己的需求進(jìn)行添加固耘,當(dāng)然也可以全部添加)
dependencies {
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.2'
}
3. 繼承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>
4. 在AndroidManifest.xml的application標(biāo)簽下,添加第三方推送實(shí)現(xiàn)類
<!--如果引入了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" />
關(guān)于<meta-data/>標(biāo)簽書寫規(guī)則:
- android:name 必須是以“ OnePush ”開頭厅目,并且以"_"進(jìn)行分割(OnePush_平臺名稱_平臺標(biāo)識碼)番枚,在初始化OnePush 的時候,根據(jù)標(biāo)識碼和當(dāng)前手機(jī)系統(tǒng)损敷,動態(tài)的使用不同平臺消息推送葫笼。
- android:value 這個是繼承IPushClient實(shí)現(xiàn)類,全類名路徑拗馒。
5. 添加第三方AppKey和AppSecret
如果使用了one-push-xiaomi,那么需要在AndroidManifest.xml添加小米的AppKey和AppSecret(注意下面的“\ ”必須加上路星,否則獲取到的是float而不是String,就會導(dǎo)致id和key獲取不到正確的數(shù)據(jù))
<!--xiaomi_push需要進(jìn)行下面的配置-->
<meta-data
android:name="MI_PUSH_APP_ID"
android:value="\ 2215463567096567312" />
<meta-data
android:name="MI_PUSH_APP_KEY"
android:value="\ 9889423330043400" />
<!--umeng_push需要進(jìn)行下面配置-->
<meta-data
android:name="UMENG_APPKEY"
android:value="593e2640b27b0a0852000014"/>
<meta-data
android:name="UMENG_MESSAGE_SECRET"
android:value="b765e337eedd391603550eb6f922f81b"/>
<!--huawei_push诱桂,在app上不需要配置appkey和secret洋丐,需要在華為開發(fā)者平臺呈昔,申請華為推送,并配置包名和證書指紋-->
6. 如果OnePush使用了小米推送友绝,需要注冊小米推送權(quán)限
<!--注意下面的必須修改 -->
<permission
android:name="com.peng.one.push.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />
<!--這里com.peng.one.push改成你的app的包名堤尾,以build.gralde中的applicationId為準(zhǔn)-->
<uses-permission android:name="com.peng.one.push.permission.MIPUSH_RECEIVE" />
<!--這里com.peng.one.push改成你的app的包名,以build.gralde中的applicationId為準(zhǔn)-->
7. 初始化OnePush
//初始化的時候迁客,回調(diào)該方法郭宝,可以根據(jù)platformCode和當(dāng)前系統(tǒng)的類型,進(jìn)行注冊
//返回true掷漱,則使用該平臺的推送粘室,否者就不使用
OnePush.init(this, ((platformCode, platformName) -> {
//platformCode和platformName就是在<meta/>標(biāo)簽中,對應(yīng)的"平臺標(biāo)識碼"和平臺名稱
if (platformCode == 102 && RomUtils.isHuaweiRom()) {//華為
return true;
} else if (platformCode == 101 && RomUtils.isMiuiRom()) {//小米
return true;
} else if (platformCode == 103) {//友盟
return true;
}
return false;
}));
OnePush.register();
8. 后臺推送動作說明:
- 注冊友盟推送除了在主進(jìn)程中卜范,還需要在channel進(jìn)程中進(jìn)行注冊衔统,具體操作見DEMO(UMeng官方推送就是這樣要求的)
- 友盟推送:后臺配置后續(xù)動作,為"自定義行為"先朦。
- 小米推送:后臺配置點(diǎn)擊后續(xù)動作缰冤,為"由應(yīng)用客戶端自定義"犬缨。
- 華為推送:后臺配置后續(xù)行為喳魏,為"自定義動作",具體內(nèi)容怀薛,可由OnePushService包:com.peng.one.push.service.huawei.intent.HWPushIntent生成刺彩,如果后臺不是java開發(fā)的,參照HWPushIntent重新寫枝恋。
9. 集成 友盟推送 的童鞋注意啦
- OnePush拓展的友盟推送是版本v3.1.1a创倔,是帶有透傳消息的。
- 關(guān)于utdid重復(fù)引入的問題焚碌,可以通過下面的方案解決
//如果utdid和你工程項(xiàng)目里面發(fā)生沖突了畦攘,請修改成這個依賴
compile ('com.peng.library:one-push-umeng:1.0.2' ){
exclude group: 'com.peng.library',module:'one-push-umeng-utdid4all'
}
- 關(guān)于友盟推送so文件處理,OnePush拓展的友盟推送十电,默認(rèn)將所有的so文件引入了知押,這樣就導(dǎo)致友盟推送aar文件大小達(dá)到2.25M左右,所以下面提供一個裁剪so文件的方法
第一步:在工程根目錄的gradle.properties文件中鹃骂,添加 android.useDeprecatedNdk=true
第二步:在項(xiàng)目(app)的build.gradle節(jié)點(diǎn)defaultConfig下添加
ndk {
// 設(shè)置支持的SO庫
abiFilters 'armeabi'//,'armeabi-v7a', 'x86', 'x86_64', 'arm64-v8a','mips','mips64'
}
根據(jù)自己工程的需要台盯,配置不同的so編譯,然后Rebuild Project畏线。
- 最后啰嗦幾句静盅,其實(shí)只要添加armeabi,就可以了寝殴,armeabi在每個平臺都是可以用的蒿叠,俗稱萬能油明垢。只是在其他CPU平臺上,使用armeabi市咽,效率不是很高而已袖外,其實(shí)微信也是只使用了armeabi,只不過它為了提高效率魂务,他將v7a也放在了armeabi里面曼验,最后根據(jù)具體安裝的手機(jī)CPU,動態(tài)加載而已粘姜。
10. 集成 華為推送 的童鞋注意啦
- BaseOnePushReceiver中的onReceiveNotification()方法鬓照,在使用的華為推送的時候,該方法不會被調(diào)用孤紧,因?yàn)槿A為推送沒有提供這樣的支持豺裆。
- BaseOnePushReceiver中的onReceiveNotificationClick()方法,在使用華為推送的時候号显,雖然華為支持臭猜,但是如果app被華為一鍵清理掉后,收到通知押蚤,那么點(diǎn)擊通知是不會調(diào)用華為推送的onEvent()方法蔑歌,那么如果我們這里轉(zhuǎn)發(fā),onReceiveNotificationClick()是不會收到的揽碘。
- 為了解決華為推送次屠,在手機(jī)上被清理掉后,onReceiveNotificationClick()不被調(diào)用的情況雳刺,OnePush在華為推送上劫灶,使用跳轉(zhuǎn)到指定Activity的推送通知,那么服務(wù)端必須提供一個Intent序列化的uri掖桦,OnePush提供的Java服務(wù)端消息推送示例中本昏,已經(jīng)提供了服務(wù)端序列化Intent的uri的實(shí)現(xiàn)(詳見:com.peng.one.push.service.huawei.intent.HWPushIntent)。
11. 關(guān)于將來拓展其他平臺消息推送說明
- 個人感覺枪汪,除了廠商的推送涌穆,其他的第三方推送只需要集成一個就可以了,假如你想使用OnePush料饥,但是目前OnePush拓展的消息推送平臺蒲犬,沒有你目前使用的怎么辦呢,可以參照OnePush拓展詳細(xì)說明岸啡,進(jìn)行集成原叮。
- 如果你已經(jīng)拓展其他平臺的消息推送,并且測試通過,可以將代碼Push過來奋隶,我檢查過后擂送,合并進(jìn)來,這樣可以方便大家唯欣。
12. 拓展其他平臺說明
關(guān)于添加其他消息推送SDK具體操作(如果你不滿足OnePush提供的小米嘹吨、華為推送,可根據(jù)下面步驟境氢,將其他廠商提供的推送蟀拷,添加到OnePush里面)
創(chuàng)建XXXClient 實(shí)現(xiàn)IPushClient接口,并且重寫對應(yīng)的方法萍聊,initContext(Context),會在初始化的使用進(jìn)行調(diào)用问芬,可以在這里進(jìn)行獲取第三方推送注冊需要的ID,KEY或者其他操作寿桨,第三方推送ID此衅、KEY,建議在AndroidManifest.xml中的Application標(biāo)簽下添加<meta/>亭螟,然后在initContext(Context)中進(jìn)行獲取挡鞍。
創(chuàng)建和重寫三方消息推送的Receiver或者IntentService(一般第三方會讓你繼承他的receiver,這里指的就是他)预烙,重寫三方推送的的接收透傳消息和通知的方法墨微,調(diào)用OneRepeater的transmitXXX方法,將通知默伍、透傳消息欢嘿、通知點(diǎn)擊事件衰琐、以及其他事件也糊,轉(zhuǎn)發(fā)到OnePush。
記得在OnePush注冊的時候羡宙,進(jìn)行消息推送平臺的選擇狸剃。
具體操作方法:詳見one-push-xiaomi
三、相關(guān)api介紹
<h6 align = "left">OnePush詳細(xì)api</h6>
方法名稱 | 描述及解釋 |
---|---|
init(Context , OnOnePushRegisterListener) | 初始化OnePush狗热,建議在Application中onCreate()方法 |
register() | 注冊消息推送 |
unregister() | 取消注冊消息推送 |
bindAlias(String) | 綁定別名 |
unBindAlias(String) | 取消綁定別名 |
addTag(String) | 添加標(biāo)簽 |
deleteTag(String) | 刪除標(biāo)簽 |
getPushPlatFormCode() | 獲取推送平臺code(AndroidManifest.xml中<meta/>注冊) |
getPushPlatFormName() | 獲取推送平臺name(AndroidManifest.xml中<meta/>注冊) |
setDebug(boolean) | 設(shè)置是否為debug模式 |
</br>
<h6 align = "left">OneRepeater詳細(xì)api</h6>
方法名稱 | 描述及解釋 |
---|---|
transmitCommandResult(Context,int,int,String,String,String) | 轉(zhuǎn)發(fā)操作反饋(具體type在OnePush.TYPE_XXX) |
transmitMessage(Context,String,String,Map<String,String>) | 轉(zhuǎn)發(fā)透傳消息 |
transmitNotification(Context,int,String,String,Sting,Map<String,String>) | 轉(zhuǎn)發(fā)通知 |
transmitNotificationClick(Context,int,String,String,Sting,Map<String,String>) | 轉(zhuǎn)發(fā)通知點(diǎn)擊事件 |