Android 百度推送实现

今天将前些日子许下的百度推送认真研究了一下,把整个步骤在此和大家分享一下,也少走一些弯路.


首先要准备的是一个可用的百度开发者账号,这个大家自行申请.并在开发者服务中,找到开发者服务管理,然后创建一个应用,这里并不是真的要让你在此创建一个完整的应用,可以理解为是注册一个应用名,目的是让百度给咱们接下来要写的应用一个对应的id,api_key等.方便接下来的使用.

Android 百度推送实现_第1张图片

接着点入对应的工程:

Android 百度推送实现_第2张图片


可以对里面进行推送设置.这里就不详细阐述.进入云推送,可以看到通知,消息,和富媒体三种推送方式.测试的时候,可以用简单的通知推送.

简单的开放云平台设置就介绍到这里.接下来是工程的创建,及代码实现.

百度推送SDK下载地址 (点击这里进行SDK下载)

将下载的压缩包解压后,将libs目录下的内容复制到我们的推送工程目录下.必须包含pushservice-4.0.0.jar 和armeabi目录下的.so文件.


接下来就是代码的实现:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, "6c3biLeh6ds1K2gXCNwG5Lrl");
	}
在MainActivity.java 中的onCreate方法内,加上如下代码:
PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, "6c3biLeh6ds1K2gXCNwG5Lrl");
其中,PushConstants.LOGIN_TYPE_API_KEY为制定后面的字符串参数类型,这里制定为Api-key 

6c3biLeh6ds1K2gXCNwG5Lrl 这里为之前在百度云平台申请的APIkey; 

然后就是新建一个receiver继承broadcastreceiver.,代码如下

import com.baidu.android.pushservice.PushConstants;
import com.example.bdpush.NotificationActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyPushReceiver extends BroadcastReceiver {

	/** TAG to Log */
	public static final String TAG = MyPushReceiver.class.getSimpleName();

	/**
	 * @param context
	 *            Context
	 * @param intent
	 *            接收的intent
	 */
	@Override
	public void onReceive(final Context context, Intent intent) {
		Log.d(TAG, ">>> Receive intent: \r\n" + intent);
		if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
			// 获取消息内容
			String message = intent.getExtras().getString(PushConstants.EXTRA_PUSH_MESSAGE_STRING);
			// 消息的用户自定义内容读取方式
			Log.i(TAG, "onMessage: " + message);
			// 自定义内容的json串
			Log.d(TAG, "EXTRA_EXTRA = " + intent.getStringExtra(PushConstants.EXTRA_EXTRA));
		} else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) {
			// 处理绑定等方法的返回数据
			// PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到
			// 获取方法
			final String method = intent.getStringExtra(PushConstants.EXTRA_METHOD);
			// 方法返回错误码。若绑定返回错误(非0),则应用将不能正常接收消息。
			// 绑定失败的原因有多种,如网络原因,或access token过期。
			// 请不要在出错时进行简单的startWork调用,这有可能导致死循环。
			// 可以通过限制重试次数,或者在其他时机重新调用来解决。
			int errorCode = intent.getIntExtra(PushConstants.EXTRA_ERROR_CODE,
					PushConstants.ERROR_SUCCESS);
			String content = "";
			if (intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT) != null) {
				// 返回内容
				content = new String(intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT));
			}
			// 用户在此自定义处理消息,以下代码为demo界面展示用
			Log.d(TAG, "onMessage: method : " + method);
			Log.d(TAG, "onMessage: result : " + errorCode);
			Log.d(TAG, "onMessage: content : " + content);
			// 可选。通知用户点击事件处理
		} else if (intent.getAction().equals(PushConstants.ACTION_RECEIVER_NOTIFICATION_CLICK)) {
//			Log.d(TAG, "intent=" + intent.toUri(0));
			// 自定义内容的json串
			Intent intent2 = new Intent(context, NotificationActivity.class);
			intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(intent2);
//			Log.d(TAG,"EXTRA_EXTRA = " + intent.getStringExtra(PushConstants.EXTRA_EXTRA));
		}
	}

}

其中:
else if (intent.getAction().equals(PushConstants.ACTION_RECEIVER_NOTIFICATION_CLICK)) {
//			Log.d(TAG, "intent=" + intent.toUri(0));
			// 自定义内容的json串
			Intent intent2 = new Intent(context, NotificationActivity.class);
			intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(intent2);
//			Log.d(TAG,"EXTRA_EXTRA = " + intent.getStringExtra(PushConstants.EXTRA_EXTRA));
		}

这段代码中,处理自己的通知栏点击逻辑.我这里是点击通知栏后开启一个新的界面.需要注意的是,在云平台发送通知的时候,要在高级设置里更改通知后续行为,默认是打开应用.可以将设置为打开网页,或者其他,其他里写与不写一样,不写则无默认动作.如果不更改,则会重新打开应用,仔细观察,将会发现应用的主界面重新开启.可能会百思不解.(我就这里浪费2个小时...........)

接下来就是清单文件的配置,权限配置,和广播注册.

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
这里是权限,下面是广播注册

 <!-- push service client -->
        <receiver android:name="com.example.bdpush.receiver.MyPushReceiver" >
            <intent-filter>

                <!-- 接收push消息 -->
                <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                <!-- 接收bind、setTags等method的返回结果 -->
                <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
                <!-- 可选。接受通知点击事件,和通知自定义内容 -->
                <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
            </intent-filter>
        </receiver>
        <!-- push service start -->
        <!-- 用于接收系统消息以保证PushService正常运行 -->
        <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>
        <!-- Push服务接收客户端发送的各种请求 -->
        <!-- 注意:RegistrationReceiver 在2.1.1及之前版本有拼写失误,为RegistratonReceiver ,用新版本SDK时请更改为如下代码 -->
        <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>
        <!-- Push 服务 -->
        <!-- 注意:在4.0 (包含)之后的版本需加上如下所示的intent-filter action -->
        <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 service end -->

好了,一个简单的推送服务就这样完成了.希望能让大家少走些弯路.


你可能感兴趣的:(Android 百度推送实现)