百度推送--搭架子

来源:互联网 发布:淘宝涛哥电玩店 编辑:程序博客网 时间:2024/04/28 02:40

准备工作

--百度开发者账号 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的相关方法中进行处理。

0 0
原创粉丝点击