Android手機端小米推送Demo解析和實現方法_Android

來源:互聯網
上載者:User

最近這幾個月都是在準備找工作和找工作中,付出了很多,總算是有點收穫,所以都沒有怎麼整理筆記。到了最近才有空把自己的筆記整理一下發上來,分享一下我的學習經驗。

推送
由於最近項目要用到Android的訊息推送,關於Android推送的解決方案有很多種,有C2DM,輪詢, SMS,MQTT協議,XMPP協議和第三方平台,經過我們對項目需求的考慮之後我們選擇了第三方平台推送的小米推送,下面就是小米推送的實現方法。

實現準備

想要用小米推送首先要去小米開發人員平台註冊申請開發人員帳號,經過1到3天的審核之後就會通過,然後就可以申請推送服務。申請一個App的推送服務之後,獲得AppID和AppKey就可以去學習它給Demo來使用了,下面我主要就是講一下我對Demo的理解。

推送說明

推送的內容可以由後台服務端利用小米推送的SDK實現發送,也可以在小米的推送平台發送,發送的訊息有兩種:通知訊息和透傳資訊。

通知訊息:

就是會顯示在Android系統通知欄的訊息,使用者點擊它的響應事件要自己實現或者在發送的時候說明點擊開啟App。

透傳訊息:

即是透明傳送,即傳送網路無論傳輸業務如何,只負責將需要傳送的業務傳送到目的節點,同時保證傳輸的品質即可,而不對傳輸的業務進行處理。就是直接把訊息傳給App,不會自動在通知欄上顯示。

官方Demo說明

官方給出的Demo裡面簡單地為我們展示了一下小米推送的各種設定和怎樣實現接收推送。Demo首先把小米推送的SDK加入Library,然后里面有4個Java檔案,如圖

第4個Dialog可以不用看,關鍵是DemoMessageReceiver這個廣播接收器,接收推送到的各種資訊然後進行處理。還有那個DemoApplication和MainActivity就是用來實現接收到資訊的顯示。

然後介面是這樣的(demo沒做螢幕適配,所以就那樣了):

一堆關於推送的配置,和一個顯示Log的TextView。主要為我們展示了小米推送的使用過程。

DemoMessageReceiver廣播接收器

要實現小米推送的移動端接收,核心就是上面說到最主要的DemoMessageReceiver這個廣播接收器。這個繼承了小米SDK裡面的PushMessageReceiver類裡面,這個廣播接收器可以通過重寫下面這5個回調方法來實現對推送的處理。
 

@Override  public void onReceivePassThroughMessage(Context context, MiPushMessage miPushMessage) {    //用來接收伺服器向用戶端發送的透傳訊息,收到透傳訊息會觸發。  }  @Override  public void onNotificationMessageClicked(Context context, MiPushMessage miPushMessage) {    //用來接收伺服器向用戶端發送的通知訊息,這個回調方法會在使用者手動點擊通知後觸發。  }  @Override  public void onNotificationMessageArrived(Context context, MiPushMessage miPushMessage) {    //用來接收伺服器向用戶端發送的通知訊息,這個回調方法是在通知訊息到達用戶端時觸發。另外應用在前台時不彈出通知的通知訊息到達用戶端也會觸發這個回呼函數  }  @Override  public void onReceiveRegisterResult(Context context, MiPushCommandMessage miPushCommandMessage) {    //用來接收用戶端向伺服器發送註冊命令後的響應結果  }  @Override  public void onCommandResult(Context context, MiPushCommandMessage miPushCommandMessage) {    //用來接收用戶端向伺服器發送命令後的響應結果。這裡可以收到到各種命令的返回結果,例如註冊服務、設定別名之類的結果,在這裡可以實現初始化錯誤然後重啟之類的功能。  }

DemoApplication繼承Application類

這個Application類的主要功能有設定App的ID和KEY,還有在onCreate方法裡面註冊推送服務。

在這個Demo裡面,它還在裡面弄了一個Handler來讓廣播接收器可以使用它來發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發送廣播    // 可以從DemoMessageReceiver的onCommandResult方法中MiPushCommandMessage對象參數中擷取註冊資訊    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主要是實現介面的那些按鈕的處理,藉此來告訴我們怎樣設定本地的推送方案,具體的設定有

  • 設定、撤銷別名:別名(Alias)是除了Regid(自動產生的)和UserAccount之外的使用者標識,可以通過MiPushClient.setAlias()方法和MiPushClient.unsetAlias()來設定和撤銷。
  • 設定、撤銷使用者帳號(UserAccoun):可以通過MiPushClient.setUserAccount()方法和MiPushClient.unsetUserAccount()方法來設定和撤銷。
  • 訂閱、撤銷標籤:開發人員可以結合自己的業務特徵,給使用者打上不同的標籤(Topic)。訊息推送時,開發人員可以結合每條訊息的內容和目標使用者,為每條訊息選擇對應的標籤,向打了該標籤的所有使用者推送訊息。可以通過MiPushClient.subscribe()和MiPushClient.unsubscribe()來訂閱和取消。
  • 暫停、恢複推送,設定推送時間:設定推送時間Demo用到了一個自製的Dialog類TimeIntervalDialog來讓使用者佈建(強行增大了代碼量),可以通過MiPushClient.setAcceptTime()來設定,暫停和恢複是通過pausePush()和resumePush()設定。
  •  不過暫停和恢複底層上的實現其實還是調用設定推送時間為00:00 - 00:00和00:00 - 23:59而已,而且還要注意的是不處在接收時段是暫時不接收推送訊息而已,一旦到了接收時段那個訊息還是會陸續推送到來。

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(都是靜態註冊,因為要長期處在後台運行,還有繼承了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改好成自己的(記得是對應好包名和應用程式名稱字的),然後就能夠接收相應的推送了。

移動端移植實現

大概理解了這個Demo之後,就可以把小米推送移植到自己的App上去實現自己的需求了,移植的時候要注意:

  1. 首先要想好應用的包名,從小米推送平台那裡註冊,獲得AppID和AppKey。
  2. 然在把小米推送的SDK加入庫。
  3. AndroidManifest檔案裡面配置好許可權(在Android6.0裡面的許可權可能需要動態擷取),註冊好那些Service和BroadcastReceiver
  4. 在應用開始的時候記得初始化註冊小米推送服務。
  5. 最後就可以繼承一個PushMessageReceiver,在裡面為所欲為了。
  6. 最後提供一個我寫的簡化之後的Demo,理解了上面之後可以參考我這個簡化的移植了,畢竟上面的太全面,我們實際看需求實現就行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.