1. 申请应用消息推送账号
集成SDK之前, 请在 http://message.umeng.com 创建应用,获取应用对应的AppKey和Umeng Message Secret。并将自己服务器ip地址加入到白名单。
2.导入sdk所需的jar包和so包
jar包是com.umeng.message.lib_v2.,5.0.jar,so包支持多个平台,包括armeabi,armeabi- v7a,arm64-v8a,x86,x86_64,mips和mips64;每个目录下面包含 libcocklogic.so和libtnet-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添加的Service,Umeng的消息接收后的处理服务 -->
<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实例。