准备工作
--百度开发者账号 http://developer.baidu.com/cloud/push
--接入移动应用 http://developer.baidu.com/console#app/mobile,获取API Key
--获取sdk http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk,得到pushservice-4.1.0.jar和demo
下面开始在自己的项目中,加入百度推送代码(需要粘贴的东西上demo中找)
1、导入pushservice的jar包和你的项目需要的so包,build path
2、把项目的application继承百度的com.baidu.frontia.FrontiaApplication.分两种情况(注意:每个项目只有一个Application子类)
如果工程中已经有了Application的继承类,那么,您需要将父类改为com.baidu.frontia.FrontiaApplication,onCreate()方法一定要super.onCreate();。
如果您没有实现Application的继承类,那么,请在AndroidManifest.xml的Application标签中增加name属性:
<application android:name="com.baidu.frontia.FrontiaApplication"...
3、在mainfest中加入Push service 运行需要的权限
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<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" />
在<application>标签下加入子标签,value值为接入应用获取的api key
<!-- 百度推送 -->
<meta-data android:name="api_key" android:value="88888888888888888888888888" />
4、在工程中新建baidupush包,把demo中的Utils类复制过来,该类包含这么几个工具方法
-- // 获取ApiKey,88888888888888888888888888
public static String getMetaValue(Context context, String metaKey) {}
-- // 推送服务是否已经绑定的标记,如果已经绑定,不必重复开启推送服务
public static boolean hasBind(Context context) {}
5、开启百度推送服务
分两种方式:1、使用百度账号登录后,开启推送服务。这种方式参见demo和用户手册。
2、不使用百度账号,开启推送服务。开启之后,虽然没有百度账号,但每个设备上的应用会生成userId,这样来进行推送服务,下面以此为例
在项目主框Activity(比如,MainActivity)的onCreate()方法中
if (!Utils.hasBind(getApplicationContext())) {
//不使用百度登录账号体系开启百度推送服务
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY,Utils.getMetaValue(MainFrameBasicActivity.this, "api_key"));
// Push: 如果想基于地理位置推送,可以打开支持地理位置的推送的开关
// PushManager.enableLbs(getApplicationContext());
}
// Push: 设置自定义的通知样式,具体API介绍见用户手册,如果想使用系统默认的可以不加这段代码
// 请在通知推送界面中,高级设置->通知栏样式->自定义样式,填写值:1,
// 与下方代码中 PushManager.setNotificationBuilder(this, 1, cBuilder)中的第二个参数对应
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
getApplicationContext(), 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);
上面的PushManager.startWork();开启了推送服务,CustomPushNotificationBuilder一段代码定义了通知的样式,需要创建相应的资源文件,包括notification_custom_builder.xml和一些图片、字符串资源,参考demo创建自己的通知样式。
6、消息处理receiver
上面开启了推送服务,接下来接受后台推送的信息,并做相应处理。新建MyPushMessageReceiver继承 com.baidu.frontia.api.FrontiaPushMessageReceiver,重写其抽象方法。在mainfest中进行声明
<!-- 推送服务的客户端,即接收端 -->
<receiver android:name=".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>
还有用百度推送必须的receviver和service声明,下面两个receiver和一个service是百度jar包里的类,声明原封不动粘上
<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" />
</intent-filter>
</receiver>
<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>
<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>
<!-- push结束 -->
调用PushManager.startWork后,发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。如果您需要用单播推送,需要把这里获取的channel id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
---onBind(),用来处理启动服务startWork()的返回值,0是成功,绑定成功后把绑定标记置为true,Utils.setBind(context, true);
后台推送的消息分为两种,用户可见、不可见,即推送通知、推送透传
--onNotificationClicked(),用户点击通知后,执行该方法代码
--onMessage(),用户不可见,服务器透传消息过来,在此方法中进行默默处理
--onUnbind(),PushManager.stopWork() 的回调函数。解除绑定Utils.setBind(context, false);
其他方法是tag相关操作的回调。
至此,推送的架子已经搭完,之后后台推数据,只需要在receiver的相关方法中进行处理。