亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android手機(jī)端小米推送Demo解析和實(shí)現(xiàn)方法

 更新時(shí)間:2016年10月28日 11:34:44   作者:炎之鎧  
本篇文章主要是介紹了Android端小米推送Demo解析和實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

最近這幾個(gè)月都是在準(zhǔn)備找工作和找工作中,付出了很多,總算是有點(diǎn)收獲,所以都沒有怎么整理筆記。到了最近才有空把自己的筆記整理一下發(fā)上來,分享一下我的學(xué)習(xí)經(jīng)驗(yàn)。

推送
由于最近項(xiàng)目要用到Android的消息推送,關(guān)于Android推送的解決方案有很多種,有C2DM,輪詢, SMS,MQTT協(xié)議,XMPP協(xié)議和第三方平臺,經(jīng)過我們對項(xiàng)目需求的考慮之后我們選擇了第三方平臺推送的小米推送,下面就是小米推送的實(shí)現(xiàn)方法。

實(shí)現(xiàn)準(zhǔn)備

想要用小米推送首先要去小米開發(fā)者平臺注冊申請開發(fā)者賬號,經(jīng)過1到3天的審核之后就會通過,然后就可以申請推送服務(wù)。申請一個(gè)App的推送服務(wù)之后,獲得AppID和AppKey就可以去學(xué)習(xí)它給Demo來使用了,下面我主要就是講一下我對Demo的理解。

推送說明

推送的內(nèi)容可以由后臺服務(wù)端利用小米推送的SDK實(shí)現(xiàn)發(fā)送,也可以在小米的推送平臺發(fā)送,發(fā)送的消息有兩種:通知消息和透傳信息。

通知消息:

就是會顯示在Android系統(tǒng)通知欄的消息,用戶點(diǎn)擊它的響應(yīng)事件要自己實(shí)現(xiàn)或者在發(fā)送的時(shí)候說明點(diǎn)擊打開App。

透傳消息:

即是透明傳送,即傳送網(wǎng)絡(luò)無論傳輸業(yè)務(wù)如何,只負(fù)責(zé)將需要傳送的業(yè)務(wù)傳送到目的節(jié)點(diǎn),同時(shí)保證傳輸?shù)馁|(zhì)量即可,而不對傳輸?shù)臉I(yè)務(wù)進(jìn)行處理。就是直接把消息傳給App,不會自動在通知欄上顯示。

官方Demo說明

官方給出的Demo里面簡單地為我們展示了一下小米推送的各種設(shè)置和怎樣實(shí)現(xiàn)接收推送。Demo首先把小米推送的SDK加入Library,然后里面有4個(gè)Java文件,如圖

第4個(gè)Dialog可以不用看,關(guān)鍵是DemoMessageReceiver這個(gè)廣播接收器,接收推送到的各種信息然后進(jìn)行處理。還有那個(gè)DemoApplication和MainActivity就是用來實(shí)現(xiàn)接收到信息的顯示。

然后界面是這樣的(demo沒做屏幕適配,所以就那樣了):

一堆關(guān)于推送的配置,和一個(gè)顯示Log的TextView。主要為我們展示了小米推送的使用過程。

DemoMessageReceiver廣播接收器

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

@Override
  public void onReceivePassThroughMessage(Context context, MiPushMessage miPushMessage) {
    //用來接收服務(wù)器向客戶端發(fā)送的透傳消息,收到透傳消息會觸發(fā)。
  }

  @Override
  public void onNotificationMessageClicked(Context context, MiPushMessage miPushMessage) {
    //用來接收服務(wù)器向客戶端發(fā)送的通知消息,這個(gè)回調(diào)方法會在用戶手動點(diǎn)擊通知后觸發(fā)。
  }


  @Override
  public void onNotificationMessageArrived(Context context, MiPushMessage miPushMessage) {
    //用來接收服務(wù)器向客戶端發(fā)送的通知消息,這個(gè)回調(diào)方法是在通知消息到達(dá)客戶端時(shí)觸發(fā)。另外應(yīng)用在前臺時(shí)不彈出通知的通知消息到達(dá)客戶端也會觸發(fā)這個(gè)回調(diào)函數(shù)
  }


  @Override
  public void onReceiveRegisterResult(Context context, MiPushCommandMessage miPushCommandMessage) {
    //用來接收客戶端向服務(wù)器發(fā)送注冊命令后的響應(yīng)結(jié)果
  }

  @Override
  public void onCommandResult(Context context, MiPushCommandMessage miPushCommandMessage) {
    //用來接收客戶端向服務(wù)器發(fā)送命令后的響應(yīng)結(jié)果。這里可以收到到各種命令的返回結(jié)果,例如注冊服務(wù)、設(shè)置別名之類的結(jié)果,在這里可以實(shí)現(xiàn)初始化錯(cuò)誤然后重啟之類的功能。
  }

DemoApplication繼承Application類

這個(gè)Application類的主要功能有設(shè)置App的ID和KEY,還有在onCreate方法里面注冊推送服務(wù)。

在這個(gè)Demo里面,它還在里面弄了一個(gè)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服務(wù),注冊成功后會向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());
    }
  }

  //這里是檢測進(jìn)程是否處于前臺的方法
  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主要是實(shí)現(xiàn)界面的那些按鈕的處理,借此來告訴我們怎樣設(shè)置本地的推送方案,具體的設(shè)置有

  • 設(shè)置、撤銷別名:別名(Alias)是除了Regid(自動生成的)和UserAccount之外的用戶標(biāo)識,可以通過MiPushClient.setAlias()方法和MiPushClient.unsetAlias()來設(shè)定和撤銷。
  • 設(shè)置、撤銷用戶賬號(UserAccoun):可以通過MiPushClient.setUserAccount()方法和MiPushClient.unsetUserAccount()方法來設(shè)定和撤銷。
  • 訂閱、撤銷標(biāo)簽:開發(fā)者可以結(jié)合自己的業(yè)務(wù)特征,給用戶打上不同的標(biāo)簽(Topic)。消息推送時(shí),開發(fā)者可以結(jié)合每條消息的內(nèi)容和目標(biāo)用戶,為每條消息選擇對應(yīng)的標(biāo)簽,向打了該標(biāo)簽的所有用戶推送消息??梢酝ㄟ^MiPushClient.subscribe()和MiPushClient.unsubscribe()來訂閱和取消。
  • 暫停、恢復(fù)推送,設(shè)置推送時(shí)間:設(shè)置推送時(shí)間Demo用到了一個(gè)自制的Dialog類TimeIntervalDialog來讓用戶設(shè)置(強(qiáng)行增大了代碼量),可以通過MiPushClient.setAcceptTime()來設(shè)置,暫停和恢復(fù)是通過pausePush()和resumePush()設(shè)置。
  •  不過暫停和恢復(fù)底層上的實(shí)現(xiàn)其實(shí)還是調(diào)用設(shè)置推送時(shí)間為00:00 - 00:00和00:00 - 23:59而已,而且還要注意的是不處在接收時(shí)段是暫時(shí)不接收推送消息而已,一旦到了接收時(shí)段那個(gè)消息還是會陸續(xù)推送到來。

AndroidManifest文件的配置

首先小米推送支持最低的Android版本是2.2,所以要

<uses-sdk android:minSdkVersion="8"/>

后需要的是如下權(quán)限:

  <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)注冊,因?yàn)橐L期處在后臺運(yùn)行,還有繼承了PushMessageReceiver的DemoMessageReceiver也需要注冊不要忘了)和Service,一共是3個(gè)廣播接收器和4個(gè)服務(wù)。

       

<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改好成自己的(記得是對應(yīng)好包名和應(yīng)用名字的),然后就能夠接收相應(yīng)的推送了。

移動端移植實(shí)現(xiàn)

大概理解了這個(gè)Demo之后,就可以把小米推送移植到自己的App上去實(shí)現(xiàn)自己的需求了,移植的時(shí)候要注意:

  1. 首先要想好應(yīng)用的包名,從小米推送平臺那里注冊,獲得AppID和AppKey。
  2. 然在把小米推送的SDK加入庫。
  3. AndroidManifest文件里面配置好權(quán)限(在Android6.0里面的權(quán)限可能需要動態(tài)獲取),注冊好那些Service和BroadcastReceiver
  4. 在應(yīng)用開始的時(shí)候記得初始化注冊小米推送服務(wù)。
  5. 最后就可以繼承一個(gè)PushMessageReceiver,在里面為所欲為了。
  6. 最后提供一個(gè)我寫的簡化之后的Demo,理解了上面之后可以參考我這個(gè)簡化的移植了,畢竟上面的太全面,我們實(shí)際看需求實(shí)現(xiàn)就行。

相關(guān)文章

  • 詳解Flutter中數(shù)據(jù)傳遞的方式

    詳解Flutter中數(shù)據(jù)傳遞的方式

    這篇文章主要和大家分享一下Flutter中常用的幾種數(shù)據(jù)傳遞方式的應(yīng)用場景以及優(yōu)缺點(diǎn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06
  • android底層去掉虛擬按鍵的實(shí)例講解

    android底層去掉虛擬按鍵的實(shí)例講解

    今天小編就為大家分享一篇android底層去掉虛擬按鍵的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效

    Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效

    我們的?App?大部分時(shí)候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來介紹一個(gè)能夠輕松實(shí)現(xiàn)文字漸變色的組件?——?ShaderMask,感興趣的可以了解一下
    2022-12-12
  • Kotlin 協(xié)程的異常處理準(zhǔn)則

    Kotlin 協(xié)程的異常處理準(zhǔn)則

    協(xié)程是互相協(xié)作的程序,協(xié)程是結(jié)構(gòu)化的,正是因?yàn)閰f(xié)程的這兩個(gè)特點(diǎn),導(dǎo)致它和 Java 的異常處理機(jī)制不一樣,這篇文章重點(diǎn)給大家介紹Kotlin 協(xié)程的異常處理準(zhǔn)則,感興趣的朋友一起看看吧
    2024-01-01
  • Android 編程下字庫的使用及注意事項(xiàng)

    Android 編程下字庫的使用及注意事項(xiàng)

    在安卓操作系統(tǒng)下對于 TextView 字體的支持非常有限,默認(rèn)情況下TextView的typeface屬性支持三種字體;接下來本文將會介紹Android 編程下字庫的使用及注意事項(xiàng),感興趣的朋友可以了解下,希望對你有所幫助
    2013-01-01
  • Flutter?DateTime獲取本月的開始時(shí)間與結(jié)束時(shí)間方法

    Flutter?DateTime獲取本月的開始時(shí)間與結(jié)束時(shí)間方法

    這篇文章主要為大家介紹了Flutter?DateTime獲取本月的開始時(shí)間與結(jié)束時(shí)間方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2023-05-05
  • 解決Android原生定位的坑

    解決Android原生定位的坑

    這篇文章主要介紹了解決Android原生定位的坑,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 更新至Android Studio4.1后發(fā)現(xiàn)as打不開的解決方法(原因分析)

    更新至Android Studio4.1后發(fā)現(xiàn)as打不開的解決方法(原因分析)

    這篇文章主要介紹了更新至Android Studio4.1后發(fā)現(xiàn)as打不開的解決方案,本文給大家分享問題所在原因給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Android7.0實(shí)現(xiàn)拍照和相冊選取圖片功能

    Android7.0實(shí)現(xiàn)拍照和相冊選取圖片功能

    這篇文章主要為大家詳細(xì)介紹了Android7.0實(shí)現(xiàn)拍照和相冊選取圖片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android TextView自定義數(shù)字滾動動畫

    Android TextView自定義數(shù)字滾動動畫

    這篇文章主要為大家詳細(xì)介紹了Android TextView自定義數(shù)字滾動動畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論