Write in front
Today I will push you an article about Baidu push. The apps commonly used on our mobile phones will always display push messages in our message bar from time to time. Commonly used are QQ message push, WeChat message push, Alipay transfer message push, etc. In the future, you will use push for large and small projects. Today I summarized an article using Baidu Cloud for push messages. You will often use it in future projects. Learn when you have time!
Use Baidu Cloud to implement App notification push
Step 1: First register an account in Baidu Cloud ( http://push.baidu.com/ )
Step 2: After registering an account, create an application
Step 3: Click to create a new application.
Step 4: Fill in the application name.
Step 5: Click to create the application and configure the application.
Step 6: Select the terminal (here we choose Android), and fill in the project package name.
Step 7: Remember to use it in the API KEY project.
Step 8: Download Baidu Push SDK (official website) and add it to the project. (Public account reply: Baidu SDK can be obtained)
Step 9: Start to create a new Android project as BaiDu_Push_Demo.
Step 10: Add dependencies in build.gradle.
1//加载jar包
2compile files('src/main/JniLibs/pushservice-6.1.1.21.jar')
Step 11: Create a new PushServiceReceiver.java class (the classes are all about Baidu push callbacks)
1package com.example.boybaby.baidu_pust_demo;
2/**
3 * Created by apple on 2018/4/25.
4 */
5import android.content.Context;
6import android.text.TextUtils;
7import android.util.Log;
8import android.widget.Toast;
9import org.json.JSONException;
10import org.json.JSONObject;
11import java.util.List;
12/*
13 * Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值;
14 *onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调;
15 *onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调
16 * 返回值中的errorCode,解释如下:
17 *0 - Success
18 *10001 - Network Problem
19 *10101 Integrate Check Error
20 *30600 - Internal Server Error
21 *30601 - Method Not Allowed
22 *30602 - Request Params Not Valid
23 *30603 - Authentication Failed
24 *30604 - Quota Use Up Payment Required
25 *30605 -Data Required Not Found
26 *30606 - Request Time Expires Timeout
27 *30607 - Channel Token Timeout
28 *30608 - Bind Relation Not Found
29 *30609 - Bind Number Too Many
30 * 当您遇到以上返回错误时,如果解释不了您的问题,请用同一请求的返回值requestId和errorCode联系我们追查问题。
31 *
32 */
33public class PushMessageReceiver extends com.baidu.android.pushservice.PushMessageReceiver {
34 /**
35 * TAG to Log
36 */
37 public static final String TAG = PushMessageReceiver.class
38 .getSimpleName();
39 /**
40 * 调用PushManager.startWork后,sdk将对push
41 * server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送,需要把这里获取的channel
42 * id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
43 *
44 * @param context BroadcastReceiver的执行Context
45 * @param errorCode 绑定接口返回值,0 - 成功
46 * @param appid 应用id。errorCode非0时为null
47 * @param userId 应用user id。errorCode非0时为null
48 * @param channelId 应用channel id。errorCode非0时为null
49 * @param requestId 向服务端发起的请求id。在追查问题时有用;
50 * @return none
51 */
52 @Override
53 public void onBind(Context context, int errorCode, String appid,
54 String userId, String channelId, String requestId) {
55 String responseString = "onBind errorCode=" + errorCode + " appid="
56 + appid + " userId=" + userId + " channelId=" + channelId
57 + " requestId=" + requestId;
58 Log.d(TAG, responseString);
59 if (errorCode == 0) {
60 // 绑定成功
61 Log.d(TAG, "绑定成功");
62 }
63 }
64 /**
65 * 接收透传消息的函数。
66 *
67 * @param context 上下文
68 * @param message 推送的消息
69 * @param customContentString 自定义内容,为空或者json字符串
70 */
71 @Override
72 public void onMessage(Context context, String message,
73 String customContentString) {
74 String messageString = "透传消息 onMessage=\"" + message
75 + "\" customContentString=" + customContentString;
76 Log.d(TAG, messageString);
77 // 自定义内容获取方式,mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
78 if (!TextUtils.isEmpty(customContentString)) {
79 JSONObject customJson = null;
80 try {
81 customJson = new JSONObject(customContentString);
82 String myvalue = null;
83 if (!customJson.isNull("mykey")) {
84 myvalue = customJson.getString("mykey");
85 }
86 } catch (JSONException e) {
87 // TODO Auto-generated catch block
88 e.printStackTrace();
89 }
90 }
91 }
92 /**
93 * 接收通知到达的函数。
94 *
95 * @param context 上下文
96 * @param title 推送的通知的标题
97 * @param description 推送的通知的描述
98 * @param customContentString 自定义内容,为空或者json字符串
99 */
100 @Override
101 public void onNotificationArrived(Context context, String title,
102 String description, String customContentString) {
103 String notifyString = "通知到达 onNotificationArrived title=\"" + title
104 + "\" description=\"" + description + "\" customContent="
105 + customContentString;
106 Log.d(TAG, notifyString);
107 //Toast.makeText(context,description,Toast.LENGTH_LONG).show();
108 //Intent intent=new Intent(context,Main2Activity.class);
109 //context.startActivity(intent);
110 // 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
111 if (!TextUtils.isEmpty(customContentString)) {
112 JSONObject customJson = null;
113 try {
114 customJson = new JSONObject(customContentString);
115 String myvalue = null;
116 if (!customJson.isNull("mykey")) {
117 myvalue = customJson.getString("mykey");
118 }
119 } catch (JSONException e) {
120 // TODO Auto-generated catch block
121 e.printStackTrace();
122 }
123 }
124 // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
125 // 你可以參考 onNotificationClicked中的提示从自定义内容获取具体值
126 }
127 /**
128 * 接收通知点击的函数。
129 *
130 * @param context 上下文
131 * @param title 推送的通知的标题
132 * @param description 推送的通知的描述
133 * @param customContentString 自定义内容,为空或者json字符串
134 */
135 @Override
136 public void onNotificationClicked(Context context, String title,
137 String description, String customContentString) {
138 String notifyString = "通知点击 onNotificationClicked title=\"" + title + "\" description=\""
139 + description + "\" customContent=" + customContentString;
140 Log.d(TAG, notifyString);
141 Toast.makeText(context,description,Toast.LENGTH_LONG).show();
142 // 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
143 if (!TextUtils.isEmpty(customContentString)) {
144 JSONObject customJson = null;
145 try {
146 customJson = new JSONObject(customContentString);
147 String myvalue = null;
148 if (!customJson.isNull("mykey")) {
149 myvalue = customJson.getString("mykey");
150 }
151 } catch (JSONException e) {
152 // TODO Auto-generated catch block
153 e.printStackTrace();
154 }
155 }
156 }
157 /**
158 * setTags() 的回调函数。
159 *
160 * @param context 上下文
161 * @param errorCode 错误码。0表示某些tag已经设置成功;非0表示所有tag的设置均失败。
162 * @param failTags 设置失败的tag
163 * @param requestId 分配给对云推送的请求的id
164 */
165 @Override
166 public void onSetTags(Context context, int errorCode,
167 List<String> sucessTags, List<String> failTags, String requestId) {
168 String responseString = "onSetTags errorCode=" + errorCode
169 + " sucessTags=" + sucessTags + " failTags=" + failTags
170 + " requestId=" + requestId;
171 Log.d(TAG, responseString);
172 }
173 /**
174 * delTags() 的回调函数。
175 *
176 * @param context 上下文
177 * @param errorCode 错误码。0表示某些tag已经删除成功;非0表示所有tag均删除失败。
178 * @param failTags 删除失败的tag
179 * @param requestId 分配给对云推送的请求的id
180 */
181 @Override
182 public void onDelTags(Context context, int errorCode,
183 List<String> sucessTags, List<String> failTags, String requestId) {
184 String responseString = "onDelTags errorCode=" + errorCode
185 + " sucessTags=" + sucessTags + " failTags=" + failTags
186 + " requestId=" + requestId;
187 Log.d(TAG, responseString);
188 }
189 /**
190 * listTags() 的回调函数。
191 *
192 * @param context 上下文
193 * @param errorCode 错误码。0表示列举tag成功;非0表示失败。
194 * @param tags 当前应用设置的所有tag。
195 * @param requestId 分配给对云推送的请求的id
196 */
197 @Override
198 public void onListTags(Context context, int errorCode, List<String> tags,
199 String requestId) {
200 String responseString = "onListTags errorCode=" + errorCode + " tags="
201 + tags;
202 Log.d(TAG, responseString);
203 }
204 /**
205 * PushManager.stopWork() 的回调函数。
206 *
207 * @param context 上下文
208 * @param errorCode 错误码。0表示从云推送解绑定成功;非0表示失败。
209 * @param requestId 分配给对云推送的请求的id
210 */
211 @Override
212 public void onUnbind(Context context, int errorCode, String requestId) {
213 String responseString = "onUnbind errorCode=" + errorCode
214 + " requestId = " + requestId;
215 Log.d(TAG, responseString);
216 if (errorCode == 0) {
217 // 解绑定成功
218 Log.d(TAG, "解绑成功");
219 }
220 }
221}
Step 12: Configure permissions and related services in AndroidManifest.xml.
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="包名">
4 <!-- Push service 运行需要的权限 -->
5 <uses-permission android:name="android.permission.INTERNET" />
6 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
7 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
8 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
9 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
10 <uses-permission android:name="android.permission.VIBRATE" />
11 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
12 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
13 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
14 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
15 <!-- 富媒体需要声明的权限 -->
16 <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
17 <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
18 <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
19 <!-- 适配Android N系统必需的ContentProvider写权限声明,写权限包含应用包名 -->
20 <uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.包名" />
21 <permission
22 android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.包名"
23 android:protectionLevel="signature">
24 </permission>
25 <!-- 权限结束 -->
26 <application
27 android:allowBackup="true"
28 android:icon="@mipmap/ic_launcher"
29 android:label="@string/app_name"
30 android:roundIcon="@mipmap/ic_launcher_round"
31 android:supportsRtl="true"
32 android:theme="@style/AppTheme">
33 <activity android:name=".MainActivity">
34 <intent-filter>
35 <action android:name="android.intent.action.MAIN" />
36 <category android:name="android.intent.category.LAUNCHER" />
37 </intent-filter>
38 </activity>
39 <!-- push service start -->
40 <!-- 用于接收系统消息以保证PushService正常运行 -->
41 <receiver
42 android:name="com.baidu.android.pushservice.PushServiceReceiver"
43 android:process=":bdservice_v1">
44 <intent-filter>
45 <action android:name="android.intent.action.BOOT_COMPLETED" />
46 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
47 <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
48 <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
49 <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
50 <action android:name="android.intent.action.MEDIA_MOUNTED" />
51 <action android:name="android.intent.action.USER_PRESENT" />
52 <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
53 <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
54 </intent-filter>
55 </receiver>
56 <!-- Push服务接收客户端发送的各种请求 -->
57 <receiver
58 android:name="com.baidu.android.pushservice.RegistrationReceiver"
59 android:process=":bdservice_v1">
60 <intent-filter>
61 <action android:name="com.baidu.android.pushservice.action.METHOD" />
62 <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
63 </intent-filter>
64 <intent-filter>
65 <action android:name="android.intent.action.PACKAGE_REMOVED" />
66 <data android:scheme="package" />
67 </intent-filter>
68 </receiver>
69 <service
70 android:name="com.baidu.android.pushservice.PushService"
71 android:exported="true"
72 android:process=":bdservice_v1">
73 <intent-filter>
74 <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
75 </intent-filter>
76 </service>
77 <!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->
78 <service
79 android:name="com.baidu.android.pushservice.CommandService"
80 android:exported="true" />
81 <!-- 适配Android N系统必需的ContentProvider声明,写权限包含应用包名 -->
82 <provider
83 android:name="com.baidu.android.pushservice.PushInfoProvider"
84 android:authorities="com.example.boybaby.baidu_pust_demo.bdpush"
85 android:exported="true"
86 android:protectionLevel="signature"
87 android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.包名.PushMessageReceiver" />
88 <!-- push应用定义消息receiver声明 -->
89 <receiver android:name="com.example.boybaby.baidu_pust_demo.PushMessageReceiver">
90 <intent-filter>
91 <!-- 接收push消息 -->
92 <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
93 <!-- 接收bind、setTags等method的返回结果 -->
94 <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
95 <!-- 接收通知点击事件,和通知自定义内容 -->
96 <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
97 </intent-filter>
98 </receiver>
99 <!-- push结束 -->
100 </application>
101</manifest>
Note: The package name must be replaced with the package name in your project, otherwise the push message will not be received
Step 13: Register Baidu Push API KEY in MainAcitivity.
1package com.example.boybaby.baidu_pust_demo;
2import android.os.Bundle;
3import android.support.v7.app.AppCompatActivity;
4import com.baidu.android.pushservice.PushConstants;
5import com.baidu.android.pushservice.PushManager;
6public class MainActivity extends AppCompatActivity {
7 @Override
8 protected void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.activity_main);
11 //注册,第三个参数是要修改的API KEY的字符串
12 PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY,"Cy1dU6vskzHqPmEmNu2aCZsR");
13 }
14}
Step 14: Create a notification and send it.
Step 15: Send successfully.
Receive notification on mobile: