Android手機端小米推送Demo解析和實現(xiàn)方法
最近這幾個月都是在準備找工作和找工作中,付出了很多,總算是有點收獲,所以都沒有怎么整理筆記。到了最近才有空把自己的筆記整理一下發(fā)上來,分享一下我的學習經(jīng)驗。
推送
由于最近項目要用到Android的消息推送,關于Android推送的解決方案有很多種,有C2DM,輪詢, SMS,MQTT協(xié)議,XMPP協(xié)議和第三方平臺,經(jīng)過我們對項目需求的考慮之后我們選擇了第三方平臺推送的小米推送,下面就是小米推送的實現(xiàn)方法。
實現(xiàn)準備
想要用小米推送首先要去小米開發(fā)者平臺注冊申請開發(fā)者賬號,經(jīng)過1到3天的審核之后就會通過,然后就可以申請推送服務。申請一個App的推送服務之后,獲得AppID和AppKey就可以去學習它給Demo來使用了,下面我主要就是講一下我對Demo的理解。
推送說明
推送的內(nèi)容可以由后臺服務端利用小米推送的SDK實現(xiàn)發(fā)送,也可以在小米的推送平臺發(fā)送,發(fā)送的消息有兩種:通知消息和透傳信息。
通知消息:
就是會顯示在Android系統(tǒng)通知欄的消息,用戶點擊它的響應事件要自己實現(xiàn)或者在發(fā)送的時候說明點擊打開App。
透傳消息:
即是透明傳送,即傳送網(wǎng)絡無論傳輸業(yè)務如何,只負責將需要傳送的業(yè)務傳送到目的節(jié)點,同時保證傳輸?shù)馁|(zhì)量即可,而不對傳輸?shù)臉I(yè)務進行處理。就是直接把消息傳給App,不會自動在通知欄上顯示。
官方Demo說明
官方給出的Demo里面簡單地為我們展示了一下小米推送的各種設置和怎樣實現(xiàn)接收推送。Demo首先把小米推送的SDK加入Library,然后里面有4個Java文件,如圖
第4個Dialog可以不用看,關鍵是DemoMessageReceiver這個廣播接收器,接收推送到的各種信息然后進行處理。還有那個DemoApplication和MainActivity就是用來實現(xiàn)接收到信息的顯示。
然后界面是這樣的(demo沒做屏幕適配,所以就那樣了):
一堆關于推送的配置,和一個顯示Log的TextView。主要為我們展示了小米推送的使用過程。
DemoMessageReceiver廣播接收器
要實現(xiàn)小米推送的移動端接收,核心就是上面說到最主要的DemoMessageReceiver這個廣播接收器。這個繼承了小米SDK里面的PushMessageReceiver類里面,這個廣播接收器可以通過重寫下面這5個回調(diào)方法來實現(xiàn)對推送的處理。
@Override public void onReceivePassThroughMessage(Context context, MiPushMessage miPushMessage) { //用來接收服務器向客戶端發(fā)送的透傳消息,收到透傳消息會觸發(fā)。 } @Override public void onNotificationMessageClicked(Context context, MiPushMessage miPushMessage) { //用來接收服務器向客戶端發(fā)送的通知消息,這個回調(diào)方法會在用戶手動點擊通知后觸發(fā)。 } @Override public void onNotificationMessageArrived(Context context, MiPushMessage miPushMessage) { //用來接收服務器向客戶端發(fā)送的通知消息,這個回調(diào)方法是在通知消息到達客戶端時觸發(fā)。另外應用在前臺時不彈出通知的通知消息到達客戶端也會觸發(fā)這個回調(diào)函數(shù) } @Override public void onReceiveRegisterResult(Context context, MiPushCommandMessage miPushCommandMessage) { //用來接收客戶端向服務器發(fā)送注冊命令后的響應結果 } @Override public void onCommandResult(Context context, MiPushCommandMessage miPushCommandMessage) { //用來接收客戶端向服務器發(fā)送命令后的響應結果。這里可以收到到各種命令的返回結果,例如注冊服務、設置別名之類的結果,在這里可以實現(xiàn)初始化錯誤然后重啟之類的功能。 }
DemoApplication繼承Application類
這個Application類的主要功能有設置App的ID和KEY,還有在onCreate方法里面注冊推送服務。
在這個Demo里面,它還在里面弄了一個Handler來讓廣播接收器可以使用它來發(fā)Toast和讓MainActivity打印Log在TextView上。
// user your appid the key. private static final String APP_ID = "1000270"; // user your appid the key. private static final String APP_KEY = "670100056270"; // 此TAG在adb logcat中檢索自己所需要的信息, 只需在命令行終端輸入 adb logcat | grep // com.xiaomi.mipushdemo public static final String TAG = "com.xiaomi.mipushdemo"; private static DemoHandler sHandler = null; private static MainActivity sMainActivity = null; @Override public void onCreate() { super.onCreate(); // 注冊push服務,注冊成功后會向DemoMessageReceiver發(fā)送廣播 // 可以從DemoMessageReceiver的onCommandResult方法中MiPushCommandMessage對象參數(shù)中獲取注冊信息 if (shouldInit()) { MiPushClient.registerPush(this, APP_ID, APP_KEY); } LoggerInterface newLogger = new LoggerInterface() { @Override public void setTag(String tag) { // ignore } @Override public void log(String content, Throwable t) { Log.d(TAG, content, t); } @Override public void log(String content) { Log.d(TAG, content); } }; Logger.setLogger(this, newLogger); if (sHandler == null) { sHandler = new DemoHandler(getApplicationContext()); } } //這里是檢測進程是否處于前臺的方法 private boolean shouldInit() { ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)); List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses(); String mainProcessName = getPackageName(); int myPid = Process.myPid(); for (RunningAppProcessInfo info : processInfos) { if (info.pid == myPid && mainProcessName.equals(info.processName)) { return true; } } return false; }
MainActivity
Demo里面的MainActivity主要是實現(xiàn)界面的那些按鈕的處理,借此來告訴我們怎樣設置本地的推送方案,具體的設置有
- 設置、撤銷別名:別名(Alias)是除了Regid(自動生成的)和UserAccount之外的用戶標識,可以通過MiPushClient.setAlias()方法和MiPushClient.unsetAlias()來設定和撤銷。
- 設置、撤銷用戶賬號(UserAccoun):可以通過MiPushClient.setUserAccount()方法和MiPushClient.unsetUserAccount()方法來設定和撤銷。
- 訂閱、撤銷標簽:開發(fā)者可以結合自己的業(yè)務特征,給用戶打上不同的標簽(Topic)。消息推送時,開發(fā)者可以結合每條消息的內(nèi)容和目標用戶,為每條消息選擇對應的標簽,向打了該標簽的所有用戶推送消息??梢酝ㄟ^MiPushClient.subscribe()和MiPushClient.unsubscribe()來訂閱和取消。
- 暫停、恢復推送,設置推送時間:設置推送時間Demo用到了一個自制的Dialog類TimeIntervalDialog來讓用戶設置(強行增大了代碼量),可以通過MiPushClient.setAcceptTime()來設置,暫停和恢復是通過pausePush()和resumePush()設置。
- 不過暫停和恢復底層上的實現(xiàn)其實還是調(diào)用設置推送時間為00:00 - 00:00和00:00 - 23:59而已,而且還要注意的是不處在接收時段是暫時不接收推送消息而已,一旦到了接收時段那個消息還是會陸續(xù)推送到來。
AndroidManifest文件的配置
首先小米推送支持最低的Android版本是2.2,所以要
<uses-sdk android:minSdkVersion="8"/>
后需要的是如下權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.VIBRATE" /> <permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" android:protectionLevel="signature" /> <!--這里com.xiaomi.mipushdemo改成app的包名--> <uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" /> <!--這里com.xiaomi.mipushdemo改成app的包名-->
然后就是要注冊一堆的BroadcastReceiver(都是靜態(tài)注冊,因為要長期處在后臺運行,還有繼承了PushMessageReceiver的DemoMessageReceiver也需要注冊不要忘了)和Service,一共是3個廣播接收器和4個服務。
<service android:enabled="true" android:process=":pushservice" android:name="com.xiaomi.push.service.XMPushService"/> <service android:name="com.xiaomi.push.service.XMJobService" android:enabled="true" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE" android:process=":pushservice" /> <!--注:此service必須在3.0.1版本以后(包括3.0.1版本)加入--> <service android:enabled="true" android:exported="true" android:name="com.xiaomi.mipush.sdk.PushMessageHandler" /> <service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" /> <!--注:此service必須在2.2.5版本以后(包括2.2.5版本)加入--> <receiver android:exported="true" android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <receiver android:exported="false" android:process=":pushservice" android:name="com.xiaomi.push.service.receivers.PingReceiver" > <intent-filter> <action android:name="com.xiaomi.push.PING_TIMER" /> </intent-filter> </receiver> <receiver android:name="com.xiaomi.mipushdemo.DemoMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" /> </intent-filter> <intent-filter> <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" /> </intent-filter> <intent-filter> <action android:name="com.xiaomi.mipush.ERROR" /> </intent-filter> </receiver>
只要把demo的AppId和AppKey改好成自己的(記得是對應好包名和應用名字的),然后就能夠接收相應的推送了。
移動端移植實現(xiàn)
大概理解了這個Demo之后,就可以把小米推送移植到自己的App上去實現(xiàn)自己的需求了,移植的時候要注意:
- 首先要想好應用的包名,從小米推送平臺那里注冊,獲得AppID和AppKey。
- 然在把小米推送的SDK加入庫。
- AndroidManifest文件里面配置好權限(在Android6.0里面的權限可能需要動態(tài)獲?。?,注冊好那些Service和BroadcastReceiver
- 在應用開始的時候記得初始化注冊小米推送服務。
- 最后就可以繼承一個PushMessageReceiver,在里面為所欲為了。
- 最后提供一個我寫的簡化之后的Demo,理解了上面之后可以參考我這個簡化的移植了,畢竟上面的太全面,我們實際看需求實現(xiàn)就行。
- Android消息推送:手把手教你集成小米推送(附demo)
- Android中利用App實現(xiàn)消息推送機制的代碼
- Android中使用WebSocket實現(xiàn)群聊和消息推送功能(不使用WebView)
- 使用SignalR推送服務在Android的實現(xiàn) SignalA
- Android中使用socket通信實現(xiàn)消息推送的方法詳解
- Erlang實現(xiàn)的百度云推送Android服務端實例
- Android頂欄定時推送消息
- android push推送相關基本問答總結
- Android、iOS和Windows Phone中的推送技術詳解
- Android小米推送簡單使用方法
相關文章
Android利用ShaderMask實現(xiàn)花里胡哨的文字特效
我們的?App?大部分時候的文字都是一種顏色,實際上,文字的顏色也可以多姿多彩。我們今天就來介紹一個能夠輕松實現(xiàn)文字漸變色的組件?——?ShaderMask,感興趣的可以了解一下2022-12-12Flutter?DateTime獲取本月的開始時間與結束時間方法
這篇文章主要為大家介紹了Flutter?DateTime獲取本月的開始時間與結束時間方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2023-05-05更新至Android Studio4.1后發(fā)現(xiàn)as打不開的解決方法(原因分析)
這篇文章主要介紹了更新至Android Studio4.1后發(fā)現(xiàn)as打不開的解決方案,本文給大家分享問題所在原因給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Android TextView自定義數(shù)字滾動動畫
這篇文章主要為大家詳細介紹了Android TextView自定義數(shù)字滾動動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04