阿里推送-移动端Android集成方式

版权声明:越努力,越幸运! https://blog.csdn.net/mingtiannihao0522/article/details/81451924

这里仅仅说一下集成方式,至于使用方式,可以参考我之前整理的Jpush的,几乎一样。

先贴出官方文档(注意是V3.0.0及以上版本)
Android SDK 3.0配置

一、创建应用此处不再赘述、、、

二、集成

1.Maven库快速集成(远程同步)
在Project根目录下build.gradle文件中配置maven库URL:

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}

在对应的module下的build.gradle文件中添加对应依赖

android {
    ......
    defaultConfig {
        applicationId "com.xxx.xxx" //包名
        ......
        ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi', 'x86'
        }
        ......
    }
    ......
}
dependencies {
    ......
    compile 'com.aliyun.ams:alicloud-android-push:3.1.2@aar'
    compile 'com.aliyun.ams:alicloud-android-utils:1.1.1'
    compile 'com.aliyun.ams:alicloud-android-beacon:1.0.1'
    // 或
    compile 'com.aliyun.ams:alicloud-android-push:3.1.2'
    ......
}

注 : 如果在添加以上 abiFilter 配置之后android Studio出现以下提示:

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

则在 Project 根目录的gradle.properties文件中添加:

android.useDeprecatedNdk=true

2、手动集成

下载SDK,目前控制台下载的SDK为aar形式,具体包括:

SDK
|– alicloud-android-push-xx.aar
|– alicloud-android-utils-1.1.2.jar
|– alicloud-android-ut-5.1.0.jar
|– utdid4all-1.1.5.3_proguard.jar

可将所有SDK拷贝到libs目录下,同时在build.gradle文件中进行如下配置:

  android {
  ...
  repositories {
      flatDir {
          dirs 'libs' //this way we can find the .aar file in libs folder
      }
  }
  dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  compile (name:'alicloud-android-push-xx', ext: 'aar')
  }

三、AndroidManifest配置

1、appKey, appSecret配置

<application android:name="*****">
    <meta-data android:name="com.alibaba.app.appkey" android:value="*****"/> <!-- 请填写你自己的- appKey -->
    <meta-data android:name="com.alibaba.app.appsecret" android:value="****"/> <!-- 请填写你自己的appSecret -->
</application>

2、 Permission配置(Maven库快速集成可跳过)

<!-- 阿里云推送相关权限 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

3、其他组件配置(Maven库快速集成可跳过,注意手动集成一定要配置,要不然接收不到消息,直接拷贝即可)

<!-- Push SDK 相关组件,required-->
        <!-- 消息接收服务 -->
        <service
            android:name="com.alibaba.sdk.android.push.MsgService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.alibaba.sdk.android.push.NOTIFY_ACTION" />
            </intent-filter>
        </service>
        <service android:name="com.alibaba.sdk.android.push.channel.CheckService"
            android:process=":channel">
            <intent-filter>
                <action android:name="com.alibaba.sdk.android.push.CHECK_SERVICE" />
            </intent-filter>
        </service>
        <service android:name="com.taobao.accs.ChannelService"
            android:exported="true" android:process=":channel">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.SERVICE"/>
            </intent-filter>
        </service>
        <service
            android:name="com.taobao.accs.ChannelService$KernelService"
            android:exported="false"
            android:process=":channel" >
        </service>
        <service android:name="com.taobao.accs.data.MsgDistributeService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.RECEIVE" />
            </intent-filter>
        </service>
        <receiver android:name="com.taobao.accs.EventReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.taobao.accs.ServiceReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.COMMAND"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.START_FROM_AGOO"/>
            </intent-filter>
        </receiver>
        <service android:name="org.android.agoo.accs.AgooService"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.RECEIVE" />
            </intent-filter>
        </service>
        <service android:name="com.alibaba.sdk.android.push.AliyunPushIntentService"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.RECEIVE" />
            </intent-filter>
        </service>
        <receiver
            android:name="com.taobao.agoo.AgooCommondReceiver"
            android:process=":channel"
            android:exported="true" >
            <intent-filter>
                <action android:name="${applicationId}.intent.action.COMMAND" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <service
            android:name="com.alibaba.sdk.android.push.channel.TaobaoRecvService"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="org.android.agoo.client.MessageReceiverService" />
            </intent-filter>
        </service>
        <!-- V3.0.12及以上版本需配置 -->
        <service
            android:name="com.taobao.accs.internal.AccsJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":channel"/>
        <!-- V3.0.7及以上版本需配置 -->
        <service android:name="com.alibaba.sdk.android.push.channel.KeepChannelService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":channel" />
        <receiver android:name="com.alibaba.sdk.android.push.SystemEventReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
            </intent-filter>
        </receiver>
        <!-- V3.0.9及以上版本需配置 -->
        <activity
            android:name="com.alibaba.sdk.android.push.keeplive.PushExtActivity"
            android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
            android:excludeFromRecents="true"
            android:exported="false"
            android:finishOnTaskLaunch="false"
            android:launchMode="singleInstance"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
            android:process=":channel"
            >
        </activity>

4、自定义 消息接收Receiver
注意:此处可以做点击,或者接受的处理。具体的可以参考我之前整理的 jpush 的处理方式。

public class MyMessageReceiver extends MessageReceiver {
    // 消息接收部分的LOG_TAG
    public static final String REC_TAG = "receiver";
    @Override
    public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
        // TODO 处理推送通知
        Log.e("MyMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
    }
    @Override
    public void onMessage(Context context, CPushMessage cPushMessage) {
            Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
    }
    @Override
    public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
        Log.e("MyMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
    }
    @Override
    protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
        Log.e("MyMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
    }
    @Override
    protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
        Log.e("MyMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);
    }
    @Override
    protected void onNotificationRemoved(Context context, String messageId) {
        Log.e("MyMessageReceiver", "onNotificationRemoved");
    }
}

将该receiver添加到AndroidManifest.xml中

<!-- 消息接收监听器 (用户可自主扩展) -->
<receiver
    android:name=".MyMessageReceiver"
    android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
    </intent-filter>
</receiver>

5、Proguard配置

-keepclasseswithmembernames class ** {
    native <methods>;
}
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-keep class com.ut.** {*;}
-keep class com.ta.** {*;}
-keep class anet.**{*;}
-keep class anetwork.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-keep class android.os.**{*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.**
-dontwarn com.ta.**

6、在应用中注册和启动移动推送
此处注意:我们一般会用pushService.getDeviceId();作为与服务器交互的唯一标识

public class MainApplication extends Application {
    private static final String TAG = "Init";
    @Override
    public void onCreate() {
        super.onCreate();
        initCloudChannel(this);
    }
    /**
     * 初始化云推送通道
     * @param applicationContext
     */
    private void initCloudChannel(Context applicationContext) {
        PushServiceFactory.init(applicationContext);
        CloudPushService pushService = PushServiceFactory.getCloudPushService();
        pushService.register(applicationContext, new CommonCallback() {
            @Override
            public void onSuccess(String response) {
                Log.d(TAG, "init cloudchannel success");
            }
            @Override
            public void onFailed(String errorCode, String errorMessage) {
                Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
            }
        });
    }
}

四、大功告成。在控制台发送消息试试看。

控制台发送测试消息

猜你喜欢

转载自blog.csdn.net/mingtiannihao0522/article/details/81451924