今天将前些日子许下的百度推送认真研究了一下,把整个步骤在此和大家分享一下,也少走一些弯路.
首先要准备的是一个可用的百度开发者账号,这个大家自行申请.并在开发者服务中,找到开发者服务管理,然后创建一个应用,这里并不是真的要让你在此创建一个完整的应用,可以理解为是注册一个应用名,目的是让百度给咱们接下来要写的应用一个对应的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)); }
接下来就是清单文件的配置,权限配置,和广播注册.
<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 -->