English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Androidモバイル端末のXiaomiプッシュデモの解析と実現方法

この数ヶ月は仕事探しと仕事中で、多くの努力をしました。ようやく少し収穫がありましたので、整理する時間がなかったんです。最近やっと自分のノートを整理してここにアップロードしました。学習の経験を共有します。

プッシュ
最近のプロジェクトでAndroidのメッセージプッシュが必要になったため、Androidプッシュのソリューションはたくさんあります。C2DM、ポーリング、SMS、MQTTプロトコル、XMPPプロトコル、および第三者プラットフォームがあります。私たちのプロジェクトの要件を考慮して、第三者プラットフォームのプッシュの小米プッシュを選択しました。以下は小米プッシュの実現方法です。

準備実現

小米プッシュを使用するにはまず、小米開発者プラットフォームで開発者アカウントを登録し、申請する必要があります。それから、1まで3の検証が通過すると、それでプッシュサービスを申請することができます。アプリのプッシュサービスを申請すると、AppIDとAppKeyを取得して、それをデモで使用するために学習することができます。以下では、デモに対する私の理解について説明します。

プッシュの説明

プッシュの内容は、バックエンドサービス端末が小米プッシュのSDKを使用して送信するか、小米のプッシュプラットフォームから送信することができます。送信されるメッセージには、通知メッセージと透過情報の2種類があります。

通知メッセージ:

それはAndroidシステムの通知バーに表示されるメッセージであり、ユーザーがそれをクリックしたときの応答イベントは自分で実装するか、送信時にクリックしてAppを開くことを指示します。

透過メッセージ:

それは透過伝送であり、ネットワークの伝送業務に関係なく、必要な伝送業務を目的ノードに伝送し、同時に伝送の品質を保証するだけで、伝送業務に対して処理を行いません。メッセージを直接Appに伝えるだけで、自動的に通知バーに表示されることはありません。

公式デモの説明

公式のデモでは、小米プッシュのさまざまな設定とプッシュの受信を実現する方法を簡単に示しています。デモではまず小米プッシュのSDKをLibraryに追加し、その中には4個のJavaファイル、図のように

第4ダイアログは見なくても構いませんが、重要なのはDemoMessageReceiverという受信者広告で、受信したさまざまな情報を処理するものです。それに、DemoApplicationとMainActivityは受信した情報を表示するために使われています。

その後のインターフェースは以下のようです(デモはスクリーンアダプトを行っていないため、そのままです):

一連のプッシュの設定と、ログを表示する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では、Toastを使用してMainActivityにLogを表示するためのHandlerを用意しています。

 // 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()メソッドを使用して設定と削除ができます。
  • ユーザーアカウントの設定と削除(UserAccount):MiPushClient.setUserAccount()メソッドとMiPushClient.unsetUserAccount()メソッドを使用して設定と削除ができます。
  • タグの追加と削除:開発者は自社のビジネスの特徴に合わせて、ユーザーに異なるタグ(トピック)を付けることができます。メッセージのプッシュ時、開発者は各メッセージの内容とターゲットユーザーに合わせて、各メッセージに対応するタグを選択し、そのタグを持つすべてのユーザーにメッセージをプッシュできます。MiPushClient.subscribe()とMiPushClient.unsubscribe()を使用して追加と削除ができます。
  • プッシュの一時停止と再開、プッシュ時間の設定:プッシュ時間の設定には、ユーザーが設定できるように自作の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をアプリのパッケージ名に変更してください。-->  
  <uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" />
  <!--ここでcom.xiaomi.mipushdemoをアプリのパッケージ名に変更してください。-->

その次に、BroadcastReceiver(すべて静的登録で、長期間バックグラウンドで動作するため)とServiceを登録する必要があります。DemoMessageReceiverがPushMessageReceiverを継承していることも忘れないでください。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を提供します。上記の内容を理解した後は、私の簡略化された移植を参照してください。なぜなら、上記の内容は非常に全面的だからです。実際のニーズに応じて実装するだけで十分です。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を持ちません。また、人工編集は行われておらず、関連する法的責任も負いません。著作権侵害が疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとりあえず、このサイトは即座に侵害が疑われるコンテンツを削除します。)

基礎教程
おすすめ