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

تحليل وتنفيذ ديمو لـ Xiaomi Push على هاتف Android

في الأشهر القليلة الماضية كنت أبحث عن وظيفة وأثناء البحث عن العمل، استثمرت الكثير، وأخيراً حصلت على بعض النتائج، لذلك لم أكن قد قمت بتقديم ملاحظات. فقط في الآونة الأخيرة أتيحت لي الفرصة لتنظيم ملاحظاتي وإرسالها للنشر، لأشارك تجربتي التعليمية.

إرسال
بسبب أن مشروعي الحالي يحتاج إلى إرسال الرسائل على Android، هناك العديد من حلول إرسال الرسائل على Android، مثل C2DM، البحث المتكرر، SMS، بروتوكول MQTT، بروتوكول XMPP، والمنصات الثالثة، بعد النظر في احتياجات المشروع، اخترنا منصة التسويق الثالثة من Xiaomi للإرسال، وما يلي هو طريقة تنفيذ Xiaomi Push.

Implementation preparation

To use Xiaomi Push, you first need to register and apply for a developer account on the Xiaomi Developer Platform. After the review takes 1 to 3 days, it will be approved, and then you can apply for push services. After applying for a push service for an App, you can get AppID and AppKey and then learn how to use the Demo. Below, I will mainly talk about my understanding of the Demo.

Push description

The content of the push can be sent by the background service端 using the Xiaomi Push SDK, or sent on the Xiaomi Push platform. There are two types of messages to be sent: notification messages and transparent information.

Notification message:

It is the message that will be displayed in the Android system notification bar, and the user needs to implement the response event by himself or specify it when sending the message to open the App.

Transparent message:

It is transparent transmission, that is, the transmission network is responsible for transmitting the business to the destination node regardless of the transmission business, and ensures the quality of transmission, without processing the transmission business. It is to directly pass the message to the App without automatically displaying it in the notification bar.

Official Demo description

The official Demo simply shows us the various settings and how to implement push reception of Xiaomi Push. First, the Xiaomi Push SDK is added to the Library, and there are 4 Java files inside, as shown in the figure

The fourth Dialog can be ignored, the key is the DemoMessageReceiver broadcast receiver, which receives various push information and processes it. And that DemoApplication and MainActivity are used to implement the display of received information.

Then the interface is like this (the demo didn't do screen adaptation, so it's like that):

A series of push configuration and a TextView to display Log. It mainly shows the process of using Xiaomi Push.

DemoMessageReceiver broadcast receiver

To implement the mobile end reception of Xiaomi Push, the core is the most important DemoMessageReceiver broadcast receiver mentioned above. This receiver inherits the PushMessageReceiver class inside the Xiaomi SDK, and this broadcast receiver can implement push processing by overriding the following 5 callback methods.
 

@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 هي تعيين ID وKEY للApp، بالإضافة إلى التسجيل في خدمة الإشعارات في طريقة onCreate.

في هذاDEM، يتم إنشاء مانيجر هناك لتمكين مستقبل الإشعارات من استخدامه لإرسال Toast ولفهم MainActivity لطباعة Log على TextView.

 // استخدم appid الخاص بك وكلمة المرور.
  private static final String APP_ID = "1000270";
  // استخدم appid الخاص بك وكلمة المرور.
  private static final String APP_KEY = "670100056270";
  // البحث عن المعلومات المطلوبة في 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 هو تنفيذ معالجة الأزرار في واجهة المستخدم، بهذا الشكل يمكننا معرفة كيفية إعداد خطة التسليم المحلية، والتعديلات المحددة تشمل

  • إعداد وإلغاء إعداد الأسماء المستخدمة: الأسماء المستخدمة (الاسم المستعار) هي إشارات المستخدمين بالإضافة إلى Regid (المولد تلقائيًا) و UserAccount، يمكن إعداد وإلغاء إعداد من خلال MiPushClient.setAlias() و MiPushClient.unsetAlias().
  • إعداد وإلغاء إعداد حساب المستخدم (UserAccoun): يمكن إعداد وإلغاء إعداد من خلال MiPushClient.setUserAccount() و MiPushClient.unsetUserAccount().
  • اشتراك وإلغاء الاشتراك في العلامات: يمكن للمطورين دمج خصائص أعمالهم الخاصة، وتعيين علامات مختلفة (المواضيع) للمستخدمين. عند إرسال الرسائل، يمكن للمطورين دمج محتوى الرسالة والمستخدمين المستهدفين، وتحديد العلامة المناسبة لكل رسالة، وإرسال الرسائل إلى جميع المستخدمين الذين تم تعيين العلامة لهم. يمكن الاشتراك وإلغاء الاشتراك من خلال MiPushClient.subscribe() و MiPushClient.unsubscribe().
  • تعطيل وإعادة تشغيل التسليم، إعداد وقت التسليم: استخدمت Demo TimeDialog المعدة ذاتيًا لسماح للمستخدمين بإعداد (زيادة كمية الكود بشكل قسري)، يمكن إعداد التوقيت من خلال MiPushClient.setAcceptTime()، وتعطيل وإعادة تشغيل من خلال pausePush() و resumePush().
  •  لكن تعطيل وإعادة تشغيل التنفيذ الأساسي في الواقع هو إجراء إعداد وقت التسليم إلى 00:00 - 00:00 و00:00 - 23:59 فقط، ويجب ملاحظة أن عدم وجوده في وقت الاستقبال هو عدم استقبال رسائل التسليم فقط، ولكن بمجرد وصوله إلى وقت الاستقبال، ستصل الرسائل بشكل متتابع.

تعدادية AndroidManifest

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

后需要的是如下权限:

  
  
  
  
  
  
  
  
    
  
  

然后就是要注册一堆的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>

ببساطة قم بتعديل AppId وAppKey في demo لتكون الخاص بك (تأكد من أنها تتطابق مع اسم الحزمة واسم التطبيق)، ثم يمكنك استقبال التوصيلات المطلوبة.

نقل على الجهاز المحمول

بعد فهم هذا المثال بشكل جيد، يمكنك نقل Xiaomi Push إلى تطبيقك الخاص لتحقيق احتياجاتك الخاصة، عند النقل، يجب الانتباه إلى ما يلي:

  1. أولاً، تحتاج إلى التفكير في اسم حزمة التطبيق، وتسجيلها في منصة Xiaomi Push، للحصول على AppID وAppKey.
  2. ثم أضف SDK لمسند Xiaomi.
  3. تأكد من إعداد الصلاحيات في ملف AndroidManifest (قد تحتاج الصلاحيات في Android 6.0 إلى الحصول عليها ديناميكيا)، وتسجيل الخدمات وBroadcastReceiver المطلوبة
  4. تذكر عند بدء التطبيق إعداد التسجيل لخدمة إرسال Xiaomi.
  5. في النهاية، يمكنك توريث PushMessageReceiver، حيث يمكنك القيام بما تريد.
  6. قدم في النهاية مثال بسيط بعد تعديلي، يمكنك الاستعانة بهذا الربط المبسط بعد فهم ذلك، لأنه واسع النطاق، ونحن نرى الحاجة إلى تنفيذها فقط.

إعلان: محتويات هذا المقال تم جمعها من الإنترنت، ويتمتع صاحب الحقوق الأصلي بهذه المحتويات، تم جمع المحتويات من قبل المستخدمين عبر الإنترنت الذين قدموا مساهماتهم بشكل تلقائي وتم تحميلها، ويملك هذا الموقع حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا لاحظت أن هناك محتويات مشبوهة بالنسبة لحقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # ب @ عند إرسال البريد الإلكتروني) لإبلاغنا، وتقديم الدليل على ذلك، وإذا تم التحقق من ذلك، فإن هذا الموقع سيزيل المحتويات المشبوهة فوراً.

أنت قد تعجب بهذه