选择推送平台时,根据需求,比较了极光推送和百度推送,最后决定选择百度,心里觉得,百度相对硕大一些。
从小白开始,step by step
1. 注册百度账号。
2. 快速创建应用,先体验一把推送的感觉
在新版的管理控制平台,点击管理控制平台,创建应用,渠道那个什么的,不用管,创建成功后,会产生应用相关的信息。
有了API key 这个玩意,推送第一步已经完成了。
看这个界面
点击推送设置--->设置包名---->快速示例---->下载Android示例。这样,一个快速demo 就完成了。把这个项目导入到Eclipse中,直接运行,在控制平台发送消息,demo 就可以收到了。
百度推送的消息分为以下几种:1. 通知,就是android的下拉通知,在通知栏里面有显示;2 消息,百度所谓的透传消息。在通知栏里没有显示。3. 富媒体,这个可以推送图片、语音、甚至视频,正在测试阶段。
百度推送的几个重要的名称,这个得理解清楚了。
API Key :应用标识,服务端绑定和推送都要用到
Secret Key :应用私钥,服务端推送时用到
APP ID: 这个id ,就是个id ,虽然也有唯一行,暂时没什么用
channel ID:推送通道id,通常对应一台终端。同样的一个app ,装在手机A 和手机B上,channel id是不同的。
user id : 应用的用户id,同一个用户,可以在不同的终端上拥有同一个app 。user id 和 channel id 配合使用,可以指定到唯一用户的唯一终端。
清楚了这些,接着就把这些东西集成到自己的项目中。
3.将SDK添加到自己工程。
3.1 添加lib 文件,layout 相关的文件,可以自己写,官方给你的demo 中的,也可以使用。添加完成后,是这个样子。
3.2 将工程的Application 类继承 FrontiaApplication 类,并且添加上 super.onCreate() 这一句话,否则会崩溃。这句话,是SDK用户使用手册中的,似乎很严重的样子,不明觉厉。
```public class DemoApplication extends FrontiaApplication{
1 2 3 4 5 6 |
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
|
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
3.3 AndroidManifest.xml 中添加使用权限
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
注册自定义的Broadcast Receiver
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//注册服务端service
|
1 2 3 4 5 |
最后,别忘了添加API Key
```java
|
3.5 调用API
3.5.1 绑定: 默认绑定是自动完成的。无账号绑定就用这个方法
1 2 3 4 |
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(MainActivity.this, "api_key"));
//Utils 工具类是官方提供好的。
|
绑定的结果,会在MyPUshMessageReceiver 类的 OnBind() 方法中返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/**
* 调用PushManager.startWork后,sdk将对push server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。
* 如果您需要用单播推送,需要把这里获取的channel id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
*
* @param context
* BroadcastReceiver的执行Context
* @param errorCode
* 绑定接口返回值,0 - 成功
* @param appid
* 应用id。errorCode非0时为null
* @param userId
* 应用user id。errorCode非0时为null
* @param channelId
* 应用channel id。errorCode非0时为null
* @param requestId
* 向服务端发起的请求id。在追查问题时有用;
* @return
* none
*/
@Override
public void onBind(Context context, int errorCode, String appid,
String userId, String channelId, String requestId) {
String responseString = "onBind errorCode=" + errorCode + " appid="
+ appid + " userId=" + userId + " channelId=" + channelId
+ " requestId=" + requestId;
Log.e(TAG, responseString);
// 绑定成功,设置已绑定flag,可以有效的减少不必要的绑定请求
if (errorCode == 0) {
Utils.setBind(context, true);
Log.e(TAG, responseString+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, responseString);
}
|
接受通知后的处理方法,在通知没有点击前,是无法获取通知内容的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/**
* 接收通知点击的函数。注:推送通知被用户点击前,应用无法通过接口获取通知的内容。
*
* @param context 上下文
* @param title 推送的通知的标题
* @param description 推送的通知的描述
* @param customContentString 自定义内容,为空或者json字符串
*/
@Override
public void onNotificationClicked(Context context, String title,
String description, String customContentString) {
String notifyString = "通知点击 title="" + title + "" description=""
+ description + "" customContent=" + customContentString;
Log.d(TAG, notifyString);
// 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
if (customContentString != null & customContentString != "") {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, notifyString);
}
//customContentString 可以自定义通知的格式和内容
{
//android必选,ios可选
"title" : "hello" ,
“description: "hello world"
//android特有字段,可选
"notification_builder_id": 0,
"notification_basic_style": 7,
"open_type":0,
"net_support" : 1,
"user_confirm": 0,
"url": "http://developer.baidu.com",
"pkg_content":"",
"pkg_name" : "com.baidu.bccsclient",
"pkg_version":"0.1",
//android自定义字段
"custom_content": {
"key1":"value1",
"key2":"value2"
},
//ios特有字段,可选
"aps": {
"alert":"Message From Baidu Push",
"Sound":"",
"Badge":0
},
//ios的自定义字段
"key1":"value1",
"key2":"value2"
}
|
在MyPushMessageReceiver中,有几个很重要的方法,设置标签,删除标签,解除绑定等。
3.5.2 设置通知样式
默认的通知栏,基本可以满足需要的,要是想自定义,也有这样的接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
resource.getIdentifier("notification_custom_builder", "layout", pkgName),
resource.getIdentifier("notification_icon", "id", pkgName),
resource.getIdentifier("notification_title", "id", pkgName),
resource.getIdentifier("notification_text", "id", pkgName));
cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL);
cBuilder.setNotificationDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
cBuilder.setLayoutDrawable(resource.getIdentifier("simple_notification_icon", "drawable", pkgName));
PushManager.setNotificationBuilder(this, 1, cBuilder);
//为什么给的demo 中要搞这么高深,偶也不知道。
CustomPushNotificationBuilder(1,2,3,4);四个参数 :1,layout 文件,2,通知栏图标id 3,title id ,4, text id ,对应description 字段。
// 在这里,我一定要大声的告诉你。Notification,一定要设置icon ,不然就看不到下拉通知。因为这个问题,我找了一天半呀!
|
还有两个两个方法,设置标签,删除标签。
1 2 3 4 5 6 7 8 |
// Push: 删除tag调用方式
List<String> tags = Utils.getTagsList(textviewGid.getText().toString());
PushManager.delTags(getApplicationContext(), tags);
// Push: 设置tag调用方式
List<String> tags = Utils.getTagsList(textviewGid.getText().toString());
PushManager.setTags(getApplicationContext(), tags);
|
from:http://my.eoe.cn/imesong/archive/19335.html