(4.2.12.1)浅谈第三方推送[快速集成]:百度推送、小米推送、华为推送

在上一章节,我们了解了推送的基本概念,在本章节,我们开始使用百度推送、小米推送、华为推送

录入时版本号:

  • 百度——2016-05-27 Android V5.0.0
  • 小米——2.2.21版 于2015.11.30更新
  • 华为——Push SDK V2.7.05于2016年1月28日

第三方推送的官方网址

  • 友盟推送
  • 极光推送
  • 百度推送
  • 小米推送
  • 华为推送
  • Pushbullet

集成第三方推送的一般过程

再此之前,我们假设你已经注册了对应平台的对应账户,并且创建了对应的应用,获取到了对应AppID,Appkey,ApppSecretKey

1-环境配置

1.1-SDK引入[jar、.so、资源文件等]

  • 百度推送引入说明

    • pushservice-5.0.0.66.jar
    • .so文件arm64-v8a,armeabi,armeabi-v7a,mips,mips64,x86,x86_64
  • 小米推送引入说明

    • MiPush_SDK_Client_2_2_21.jar
  • 华为推送引入说明

    • HwPush_SDK_V2705.jar
    • res.drawable,drawable-xhdpi,layout,values,values-zh-rCN

1.2-AndroidManifest.xml配置

一般需要注册:

1.2.1-配置信息

  • 百度-配置信息
<!-- 在百度开发者中心查询应用的API Key -->
<meta-data android:name="api_key" android:value="vbhptIZZOetZTtPaEKM1a4LK" />
  • 小米-配置信息
  • 华为-配置信息

1.2.2-相关官方的Service

  • 百度-相关官方的Service
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true" android:process=":bdservice_v1" >
            <intent-filter>
                <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
            </intent-filter>
        </service>
        <!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->
    <service android:name="com.baidu.android.pushservice.CommandService" android:exported="true" />
  • 小米-相关官方的Service
 <!--官方 配置信息-->
        <!--这里将XMPushService和PingReceiver定义在了pushservice进程中, 您也可以配置其运行在任意进程。如果没有配置android:process这个属性,那么它们将运行在应用的主进程中。 要在调试程序时检查AndroidManifest.xml是否符合上述配置,使用3.4.15所述的API:checkManifest(Context)-->
        <service android:name="com.xiaomi.push.service.XMPushService" android:enabled="true" android:process=":pushservice" />
        <service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true" android:exported="true" />
        <service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
  • 华为-相关官方的Service
   <!-- PushSDK:Push服务 -->
        <service  android:name="com.huawei.android.pushagent.PushService" android:process=":pushservice" >
        </service>

1.2.3-相关官方的Receiver

  • 百度-相关官方的Receiver
  <!--官方包 push必须的receviver和service声明 用于接收系统消息以保证PushService正常运行-->
        <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver" android:process=":bdservice_v1">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
        <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
        <!--官方包 Push服务接收客户端发送的各种请求-->
        <receiver android:name="com.baidu.android.pushservice.RegistrationReceiver" android:process=":bdservice_v1">
            <intent-filter>
                <action android:name="com.baidu.android.pushservice.action.METHOD" />
                <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package" />
            </intent-filter>                   
        </receiver>
  • 小米-相关官方的Receiver
 <receiver android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" android:exported="true" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.xiaomi.push.service.receivers.PingReceiver" android:exported="false" android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.xiaomi.push.PING_TIMER" />
            </intent-filter>
        </receiver>
  • 华为-相关官方的Receiver
    <!-- 备注:Push相关的android组件需要添加到业务的AndroidManifest.xml, Push相关android组件运行在另外一个进程是为了防止Push服务异常而影响主业务 -->

        <!-- PushSDK:PushSDK接收外部请求事件入口 -->
        <receiver  android:name="com.huawei.android.pushagent.PushEventReceiver" android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.REFRESH_PUSH_CHANNEL" />
                <action android:name="com.huawei.intent.action.PUSH" />
                <action android:name="com.huawei.intent.action.PUSH_ON" />
                <action android:name="com.huawei.android.push.PLUGIN" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <receiver  android:name="com.huawei.android.pushagent.PushBootReceiver" android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.REGISTER" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <meta-data  android:name="CS_cloud_version" android:value="\u0032\u0037\u0030\u0035" />
        </receiver>

1.2.4-自定义的receiver

  • 百度-自定义的receiver
        <!-- push应用定义消息receiver声明 -->
        <receiver android:name="com.baidu.push.example.MyPushMessageReceiver">
            <intent-filter>
                <!-- 接收push消息 -->
                <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                <!-- 接收bind,unbind,fetch,delete等反馈消息 -->
                <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
                <!-- 接收通知点击事件,和通知自定义内容 -->
                <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
            </intent-filter>
        </receiver>
  • 小米-自定义的receiver
        <receiver  android:name="test.com.yu.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>
  • 华为-自定义的receiver
        <!-- 第三方相关 :接收Push消息(注册、Push消息、Push连接状态、标签,LBS上报结果)广播 -->
        <receiver android:name="com.huawei.pushtest.receiver.MyReceiver" >
            <intent-filter>
                <!-- 必须,用于接收token-->
                <action android:name="com.huawei.android.push.intent.REGISTRATION" />
                <!-- 必须,用于接收消息-->
                <action android:name="com.huawei.android.push.intent.RECEIVE" />
                <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调-->
                <action android:name="com.huawei.android.push.intent.CLICK" />
                <!-- 可选,查看push通道是否连接,不查看则不需要-->
                <action android:name="com.huawei.intent.action.PUSH_STATE" />
                <!-- 可选,标签、地理位置上报回应,不上报则不需要 -->
                <action android:name="com.huawei.android.push.plugin.RESPONSE" />
            </intent-filter>
            <meta-data android:name="CS_cloud_ablitity" android:value="@string/hwpush_ability_value"/>
        </receiver>

1.2.5-相关权限信息

  • 百度-相关权限信息
    <!-- Push service 运行需要的权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  • 小米-相关权限信息
    <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" />
    <!-- the following 2 com.xiaomi.mipushdemo should be changed to your package name -->
    <permission  android:name="test.com.yu.permission.MIPUSH_RECEIVE" android:protectionLevel="signature" />
    <uses-permission android:name="test.com.yu.permission.MIPUSH_RECEIVE" />
  • 华为-相关权限信息
<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.WAKE_LOCK" />
    <!-- 保存富媒体消息需要,无富媒体消息则不需要 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 创建桌面快捷方式,无富媒体消息则不需要 -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <!-- 根据地理位置推送消息需要事先上报地理位置信息,需要如下权限,不上报则不需要, -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!-- 访问Push APK provider需要的权限,SDK富媒体需要,无富媒体功能则不需要 -->  
    <uses-permission android:name="com.huawei.pushagent.permission.RICHMEDIA_PROVIDER"/>

1.2.6-其他信息:如富媒体等

  • 百度-其他信息:如富媒体等
        <!-- push富媒体,不使用富媒体推送不需要 -->
        <activity  android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity" android:configChanges="orientation|keyboardHidden" android:label="MediaViewActivity" >
        </activity>
        <activity  android:name="com.baidu.android.pushservice.richmedia.MediaListActivity" android:configChanges="orientation|keyboardHidden" android:label="MediaListActivity" android:launchMode="singleTask" >
        </activity>
        <!-- push富媒体结束 -->
  • 小米-其他信息:如富媒体等
  • 华为-其他信息:如富媒体等
        <!-- PushSDK:富媒体呈现页面,用于呈现服务器下发的富媒体消息 -->
        <!-- locale|layoutDirection 切换语言后不重新创建activity -->
        <activity  android:name="com.huawei.android.pushselfshow.richpush.RichPushActivity" android:process=":pushservice" android:theme="@style/hwpush_NoActionBar" android:configChanges="orientation|screenSize|locale|layoutDirection" android:screenOrientation="portrait">
            <meta-data android:name="hwc-theme" android:value="androidhwext:style/Theme.Emui"/>
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.RICHPUSH" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <activity  android:name="com.huawei.android.pushselfshow.permission.RequestPermissionsActivity" android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar" android:launchMode="singleTop" android:screenOrientation="portrait" android:configChanges="orientation|screenSize|locale|layoutDirection" android:exported="false">
        </activity>

2-在入口处调用SDK的管理类开启服务

  • 百度
    在当前工程的主Activity的onCreate函数中,其中的“API Key“需要手动修改为指定应用的API Key。添加以下代码:
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY,"api_key")
  • 小米
    为了提高push的注册率,你可以在Application的onCreate中初始化push。你也可以根据需要,在其他地方初始化push。
    通过调用MiPushClient.registerPush来初始化小米推送服务。注册成功后,您可以在自定义的onCommandResult和onReceiveRegisterResult中收到注册结果,其中的regId即是当前设备上当前app的唯一标示。您可以将regId上传到自己的服务器,方便向其发消息。
   MiPushClient.registerPush(this, APP_ID, APP_KEY);
  • 华为
    在当前工程的主Activity的onCreate函数中
 // 获取客户端AccessToken,获取之前请先确定该应用(包名)已经在开发者联盟上创建成功,并申请、审核通过Push权益
                    PushManager.requestToken(PustDemoActivity.this);

3-继承SDK的Receiver,实现相关方法并注册该Receiver

该部分详见下一章节内容

4-需要的话,在代码中调用管理类,进行设置标签等操作

该部分详见下一章节内容

5-混淆的保持处理

  • 百度
如果需要混淆app,请在混淆文件(一般默认为Android工程下proguard-project.txt或者proguard.cfg)中添加以下说明(pushservice-VERSION.jar为集成的jar包名字,VERSION为版本名称),防止SDK内容被二次混淆,无法收到消息。

     -libraryjars libs/pushservice-VERSION.jar
     -dontwarn com.baidu.**
     -keep class com.baidu.**{*; }
  • 小米
如果你的应用使用了混淆,你需要keep自定义的BroadcastReceiver。
自定义的BroadcastReceiver继承PushMessageReceiver,使用下面的代码是不行的。
-keep public class * extends android.content.BroadcastReceiver 你需要使用下面的代码keep自定义的BroadcastReceiver。 #这里com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定义的完整类名 -keep class com.xiaomi.mipush.sdk.DemoMessageReceiver {*;}
  • 华为
开发者编译APK时请不要混淆本SDK,避免功能异常。 在配置文件中加入:
-keep class com.huawei.android.pushagent.**{*;} -keep class com.huawei.android. pushselfshow.**{*;} -keep class com.huawei.android. microkernel.**{*;} -keep class com.baidu.mapapi.**{*;} 仅供参考。

你可能感兴趣的:((4.2.12.1)浅谈第三方推送[快速集成]:百度推送、小米推送、华为推送)