今天将前些日子许下的百度推送认真研究了一下,把整个步骤在此和大家分享一下,也少走一些弯路.
首先要准备的是一个可用的百度开发者账号,这个大家自行申请.并在开发者服务中,找到开发者服务管理,然后创建一个应用,这里并不是真的要让你在此创建一个完整的应用,可以理解为是注册一个应用名,目的是让百度给咱们接下来要写的应用一个对应的id,api_key等.方便接下来的使用.
接着点入对应的工程:
可以对里面进行推送设置.这里就不详细阐述.进入云推送,可以看到通知,消息,和富媒体三种推送方式.测试的时候,可以用简单的通知推送.
简单的开放云平台设置就介绍到这里.接下来是工程的创建,及代码实现.
百度推送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 -->
好了,一个简单的推送服务就这样完成了.希望能让大家少走些弯路.