1. 程式人生 > >Android開發-在Android應用裡整合友盟訊息推送SDK的實現(相容小米、華為、魅族機型離線推送)

Android開發-在Android應用裡整合友盟訊息推送SDK的實現(相容小米、華為、魅族機型離線推送)

前 言

最近由於專案的功能需求的需要,需要在Android應用整合訊息推送的功能,而目前市面上的第三方訊息推送除了友盟推送外,還有極光推送、小米推送、個推以及信鴿(騰訊)推送等。當時本人對比各大第三方的訊息推送進行了測試,覺得友盟訊息推送整合簡單,推送訊息的送達率比較高以及即時。而且支援深度優化過的Android系統的國產手機(小米、華為、魅族)應用的程序被“殺死”的情況下能及時送達推送。

整合前的工作

  1. 在友盟+(友盟+官網)的後臺註冊賬號並申請認證成為開發者,認證通過後選擇“訊息推送(U-Push)”業務後建立應用了(注意:應用的包名必須與AndroidStudio建立的包名一致,否則推送無法送達),建立應用後把應用的AppKey和Umeng Message Secret記錄下來。(如下圖) 在這裡插入圖片描述
  2. 在小米訊息推送、華為訊息推送以及魅族訊息推送渠道申請相應的祕鑰後在友盟後臺填寫相應的配置資訊。(如下圖) 在這裡插入圖片描述

友盟訊息推送SDK的整合

在AndroidStudio的Gradle的dependencies{…}下新增以下依賴:

    // PushSDK必須依賴基礎元件庫,所以需要加入對應依賴
    implementation 'com.umeng.sdk:common:1.5.3'
    // PushSDK必須依賴utdid庫,所以需要加入對應依賴
    implementation 'com.umeng.sdk:utdid:1.1.5.3'
    // PushSDK
    implementation 'com.umeng.sdk:push:4.2.0'

    // 小米Push通道
    implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
    // 華為Push通道
    implementation 'com.umeng.sdk:push-huawei:1.0.0'
    // 魅族Push通道
    implementation 'com.umeng.sdk:push-meizu:1.0.0'

如果新增依賴同步編譯後失敗的話可以嘗試在Project的Grande裡jcenter()前面新增上mavenCentral()再同步編譯看看。(如下圖) 在這裡插入圖片描述 在自定義的Application的onCreate()方法裡初始化友盟訊息推送的SDK,如下片段程式碼所示:

public class PushApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        /**
         * 初始化common庫
         * 引數1:上下文,不能為空
         * 引數2:裝置型別,UMConfigure.DEVICE_TYPE_PHONE為手機、UMConfigure.DEVICE_TYPE_BOX為盒子,預設為手機
         * 引數3:Push推送業務的secret
         */
        UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "這裡填寫應用申請到的Umeng Message Secret");

        PushAgent mPushAgent = PushAgent.getInstance(this);
        // 註冊推送服務,每次呼叫register方法都會回撥該介面
        mPushAgent.register(new IUmengRegisterCallback() {
            @Override
            public void onSuccess(String deviceToken) {
                // 註冊成功會返回device token
            }

            @Override
            public void onFailure(String s, String s1) {
            }
        });

        // 小米通道Push初始化,第一個引數為上下文,第二個引數為XIAOMI_ID ,第三個引數為XIAOMI_KEY
        MiPushRegistar.register(this, "這裡填寫小米的XIAOMI_ID", "這裡填寫小米的XIAOMI_KEY");
        // 華為通道Push初始化,華為渠道無需傳key
        HuaWeiRegister.register(this);
        // 魅族通道Push初始化,第一個引數為上下文,第二個引數為MEIZU_APPID ,第三個引數為MEIZU_APPKEY
        MeizuRegister.register(this, "這裡填寫魅族的MEIZU_APPID", "這裡填寫魅族的MEIZU_APPKEY");
    }
}

在Activity的onCreate()方法裡初始化友盟訊息推送的SDK,如下片段程式碼所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PushAgent.getInstance(context).onAppStart();
    }
}

建立多渠道MipushTestActivity程式碼檔案並繼承UmengNotifyClickActivity進行測試小米、華為以及魅族國產機型離線的推送測試,如下片段程式碼所示:

public class MipushTestActivity extends UmengNotifyClickActivity {

    private static String TAG = MipushTestActivity.class.getName();

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_mipush);
    }

    @Override
    public void onMessage(Intent intent) {
        // 此方法必須呼叫,否則無法統計開啟數
        super.onMessage(intent);
        String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
        Log.i(TAG, body);
    }
}

建立魅族所需廣播MeizuTestReceiver程式碼檔案並繼承UmengMeizuPushReceiver,如下片段程式碼所示:

public class MeizuTestReceiver extends UmengMeizuPushReceiver {
}

在Android的清單檔案裡新增相應的配置資訊及註冊相應的application、meta-data、activity以及receiver資訊。如下程式碼所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="應用的包名">

    <application
        android:name=".PushApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="UMENG_APPKEY"
            android:value="這裡新增在友盟後臺申請到的應用APPKEY" />
        <!-- Channel ID用來標識App的推廣渠道,作為推送訊息時給使用者分組的一個維度。-->
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="Channel ID" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".MipushTestActivity"
            android:exported="true"
            android:launchMode="singleTask" />

        <!--魅族push應用定義訊息receiver宣告 -->
        <receiver android:name=".MeizuTestReceiver">
            <intent-filter>
                <!-- 接收push訊息 -->
                <action android:name="com.meizu.flyme.push.intent.MESSAGE" />
                <!-- 接收register訊息 -->
                <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
                <!-- 接收unregister訊息-->
                <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
                <!-- 相容低版本Flyme3推送服務配置 -->
                <action android:name="com.meizu.c2dm.intent.REGISTRATION" />
                <action android:name="com.meizu.c2dm.intent.RECEIVE" />
                <category android:name="這裡新增應用的包名">
                </category>
            </intent-filter>
        </receiver>

    </application>

</manifest>

推送測試

在友盟+訊息推送的後臺新增推送測試的訊息。(如下圖所示) 在這裡插入圖片描述

在這裡插入圖片描述

手機端(本人的手機是小米手機,MIUI 10開發版,Android 8.1)通知欄接收到友盟後臺推送的訊息介面。(如下圖所示) 在這裡插入圖片描述