Android友盟消息推送

1. 申请应用消息推送账号

集成SDK之前, 请在 http://message.umeng.com 创建应用,获取应用对应的AppKeyUmeng Message Secret并将自己服务器ip地址加入到白名单。

2.导入sdk所需的jar包和so包

jar包是com.umeng.message.lib_v2.,5.0.jarso包支持多个平台,包括armeabiarmeabi- v7aarm64-v8ax86x86_64mipsmips64;每个目录下面包含 libcocklogic.solibtnet-2.0.17.2-agoo.so两个so包。本SDK需要最新版本的 android-support-v4.jar 支持包。请在工程中添加 android-support-v4.jar 支持包。(缺少so文件可能导致低版本安卓手机收不到推送消息的问题)

3.配置AndroidManifest.xml

3.1添加权限:在<manifest>标签下:

<!-- 必选 -->
<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.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

 

<!--【必选】用以设置前台是否显示通知>

<uses-permission android:name="android.permission.GET_TASKS" />

 

<!-- 可选 -->
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />;

3.2添加组件:

<application>标签下:

注意 

添加组件时需要将【应用包名】替换为你自己应用的包名。

 

<!-- 监听通知点击或者忽略处理的广播 -->
<receiver
    android:name="com.umeng.message.NotificationProxyBroadcastReceiver"
    android:exported="false" >
</receiver>

 

<!-- 监听开机运行、网络连接变化、卸载的广播 -->
<receiver
    android:name="com.umeng.message.SystemReceiver"
    android:process=":push" >
    <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>
</receiver>

 

<!-- 监听消息到达的广播 -->
<receiver
    android:name="com.umeng.message.MessageReceiver"
     android:exported="false" 
   android:process=":push" >
    <intent-filter>
        <action android:name="org.agoo.android.intent.action.RECEIVE" />
    </intent-filter>
</receiver>

 

<!-- 监听宿主选举的广播 -->
<receiver
    android:name="com.umeng.message.ElectionReceiver"  
     android:process=":push" >
    <intent-filter>
        <action android:name="org.agoo.android.intent.action.ELECTION_RESULT_V4" />
        <category android:name="umeng" />
    </intent-filter>
</receiver>

 

<!-- 监听注册的广播 -->

<!-- 【应用包名】字符串需要替换成本应用的应用包名 -->
<receiver
    android:name="com.umeng.message.RegistrationReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="【应用包名】.intent.action.COMMAND" />
    </intent-filter>
</receiver>
<receiver android:name="com.umeng.message.UmengMessageBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

可以根据需要自行设置 android:label 中的服务名 :

 

<!-- Umeng的长连服务,用来建立推送的长连接的 -->

<!-- 【应用包名】字符串需要替换成本应用的应用包名 -->

<service
    android:name="com.umeng.message.UmengService"
    android:label="PushService"
    android:exported="true"
    android:process=":push" >
    <intent-filter>
        <action android:name="【应用包名】.intent.action.START" />
    </intent-filter>
    <intent-filter>
        <action android:name="【应用包名】.intent.action.COCKROACH" />
    </intent-filter>
    <intent-filter>
        <action android:name="org.agoo.android.intent.action.PING_V4" />
    <category android:name="umeng" />
    </intent-filter>
</service>

<!-- Umeng的消息接收服务 -->

<service android:name="com.umeng.message.UmengIntentService" 
    android:process=":push" />

<!-- Umeng的消息路由服务 -->

<service 
    android:name="com.umeng.message.UmengMessageIntentReceiverService"
    android:process=":push" 
    android:exported="true" >
    <intent-filter>
        <action android:name="org.android.agoo.client.MessageReceiverService" />
    </intent-filter>
    <intent-filter>
        <action android:name="org.android.agoo.client.ElectionReceiverService" />
    </intent-filter>
</service>

 

<!-- v2.4.1添加的ServiceUmeng的消息接收后的处理服务 -->

<service android:name="com.umeng.message.UmengMessageCallbackHandlerService" 
    android:exported="false">
    <intent-filter>
        <action android:name="com.umeng.messge.registercallback.action" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.umeng.message.unregistercallback.action"/>
    </intent-filter>
    <intent-filter>
        <action android:name="com.umeng.message.message.handler.action"/>
    </intent-filter>
    <intent-filter>
        <action android:name="com.umeng.message.autoupdate.handler.action"/>
    </intent-filter>
</service>

 

<!-- V1.3.0添加的service,负责下载通知的资源 -->
<service android:name="com.umeng.message.UmengDownloadResourceService" />

 

<!-- V2.5.0添加的Service,用于本地通知 -->
<!-- 如果不使用本地通知,可以注释掉本地通知服务的配置 -->
<service android:name="com.umeng.message.local.UmengLocalNotificationService" 

android:exported="false" />

 

3.3添加 AppKey 和 Umeng Message Secret

在<application>标签下:

<meta-data

    android:name="UMENG_APPKEY"

    android:value="55eeb9cb6xxxxxxxx" >

</meta-data>

<meta-data

    android:name="UMENG_MESSAGE_SECRET"

    android:value="96b6665f00xxxxxxxxxxx" >

</meta-data>

4.服务器设置

5.安卓客户端代码设置

5.1开启推送服务

在应用的application onCreate() 函数中开启推送服务

mPushAgent = PushAgent.getInstance(this);

mPushAgent.enable();

5.2 获取设备的Device Token(可选)

如果在测试或其他使用场景中,需要获取设备的Device Token,可以使用下面的方法。

在应用的application initUmeng()函数中获取device token值:

String device_token = UmengRegistrar.getRegistrationId(this);

5.3注册设备

在应用的application的用户登录函数中,登陆成功后将友盟用户id发生给服务器

new Thread(){

@Override

public void run() { 

try {

// context:上下文对象

//"umeng"为应用别名,用于和别的应用区别, info.userid为接受推送消息的用户id"UU"为推送渠道名

context.mPushAgent.addAlias("umeng"+info.userid, "UU");

} catch (Exception e) {

e.printStackTrace();}

}

}.start();

账号退出时,删除跟账号相关的Alias,保证应用退出后不收到应用推送消息:

// 账号退出时,采用异步删除跟账号相关的Alias

new AsyncTask<Void, Void, Boolean>() {

@Override

protected Boolean doInBackground(Void... params) {

try {

return CRMApp.getSelf().mPushAgent.removeAlias(

"umeng"+ mApp.getUserInfo().userid,"UU");

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

5.4自定义通知打开动作

在应用的application 中定义 initUmeng() 函数初始化友盟消息的处理Handler,每次推送消息过来都会触发该Handler

/**

     * Handler是在BroadcastReceiver中被调用,故

     * 如果需启动Activity时,需添加Intent.FLAG_ACTIVITY_NEW_TASK

     * 

     * */

     UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler(){

            //点击通知的自定义行为

     @Override

     public void dealWithCustomAction(Context context, UMessage msg) {

     UMessageEntity uMessageEntity = new UMessageEntity();

     for (Entry<String, String> entry : msg.extra.entrySet()){

         String key = entry.getKey();

         String value = entry.getValue();

         if("stype".equals(key)){

          uMessageEntity.stype = value;

         }else if("userid".equals(key)){

          uMessageEntity.userid = value;

         }else if("souid".equals(key)){

          uMessageEntity.souid = value;

         }else if("noticeid".equals(key)){

          uMessageEntity.noticeid = value;

         }

     }

// MessageCenterActivity是推送消息解封装之后要跳转的页面

     intent = new Intent(mApp, MessageCenterActivity.class);

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//将解封装后的实体类对象uMessageEntity一起传递给相应的页面

             intent.putExtra("UMessage", uMessageEntity);

             startActivity(intent);

            }

     };

     mPushAgent.setNotificationClickHandler(notificationClickHandler);

}

UMessageEntity实体类代码:

public class UMessageEntity  implements Serializable{

    private static final long serialVersionUID = 1L;

    /**类型 */

    public String stype;

   /**登录人id*/

   public String userid;

   /**来源标识*/

   public String souid;

   /**通知标识*/

   public String noticeid;

}

 

说明:

1)服务器端随消息推送传过来四个参数:userid(用户标识)stype(消息类型)

Souid(来源标识)noticeid(消息标识)【参数个数和类型可以通过服务器端进行设置】

2)在下列循环中将推送消息进行解封装到uMessageEntity实体类中

for (Entry<String, String> entry : msg.extra.entrySet()){

         String key = entry.getKey();

         String value = entry.getValue();

         if("stype".equals(key)){

          uMessageEntity.stype = value;

         }else if("userid".equals(key)){

          uMessageEntity.userid = value;

         }else if("souid".equals(key)){

          uMessageEntity.souid = value;

         }else if("noticeid".equals(key)){

          uMessageEntity.noticeid = value;

         }

     }

3需要配置跳转页面Activity属性为android:launchMode="singleTask",目的是为了实现如果正在该页面展示数据时传来推送消息实现页面刷新,但是并不会重新创建一个新的activity实例。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值