選擇推送平臺時,根據需求,比較了極光推送和百度推送,最後決定選擇百度,心裏覺得,百度相對碩大一些。
從小白開始,step by step
1. 註冊百度賬號。
2. 快速創建應用,先體驗一把推送的感覺
在新版的管理控制平臺,點擊管理控制平臺,創建應用,渠道那個什麼的,不用管,創建成功後,會產生應用相關的信息。
有了API key 這個玩意,推送第一步已經完成了。
看這個界面
點擊推送設置--->設置包名---->快速示例---->下載Android示例。這樣,一個快速demo 就完成了。把這個項目導入到Eclipse中,直接運行,在控制平臺發送消息,demo 就可以收到了。
百度推送的消息分爲以下幾種:1. 通知,就是android的下拉通知,在通知欄裏面有顯示;2 消息,百度所謂的透傳消息。在通知欄裏沒有顯示。3. 富媒體,這個可以推送圖片、語音、甚至視頻,正在測試階段。
百度推送的幾個重要的名稱,這個得理解清楚了。
API Key :應用標識,服務端綁定和推送都要用到
Secret Key :應用私鑰,服務端推送時用到
APP ID: 這個id ,就是個id ,雖然也有唯一行,暫時沒什麼用
channel ID:推送通道id,通常對應一臺終端。同樣的一個app ,裝在手機A 和手機B上,channel id是不同的。
user id : 應用的用戶id,同一個用戶,可以在不同的終端上擁有同一個app 。user id 和 channel id 配合使用,可以指定到唯一用戶的唯一終端。
清楚了這些,接着就把這些東西集成到自己的項目中。
3.將SDK添加到自己工程。
3.1 添加lib 文件,layout 相關的文件,可以自己寫,官方給你的demo 中的,也可以使用。添加完成後,是這個樣子。
3.2 將工程的Application 類繼承 FrontiaApplication 類,並且添加上 super.onCreate() 這一句話,否則會崩潰。這句話,是SDK用戶使用手冊中的,似乎很嚴重的樣子,不明覺厲。
```public class DemoApplication extends FrontiaApplication{
|
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
|
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
3.3 AndroidManifest.xml 中添加使用權限
<!-- Push service 運行需要的權限 -->
<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" />
<!-- for log. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<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" />
3.4 註冊Activity 和Broadcast Receiver
自己的Activity就不說了,推送使用到富媒體的,註冊這兩個Activity
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- push service rich media display -->
<activity
android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
android:configChanges="orientation|keyboardHidden"
android:label="MediaViewActivity" >
</activity>
<activity
android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
android:configChanges="orientation|keyboardHidden"
android:label="MediaListActivity"
android:launchMode="singleTask" >
</activity>
|
1
2
3
4
5
6
7
8
9
10
11
12
|
註冊自定義的Broadcast Receiver
<!-- push service client -->
<!--這個是自己定義的-->
<receiver android:name="your package.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>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//註冊服務端service
<!-- push service -->
<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" />
|
|
最後,別忘了添加API Key
```java
<meta-data android:name="api_key" android:value="your API Key" />
|
3.5 調用API
3.5.1 綁定: 默認綁定是自動完成的。無賬號綁定就用這個方法
|
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(MainActivity.this, "api_key"));
//Utils 工具類是官方提供好的。
|
綁定的結果,會在MyPUshMessageReceiver 類的 OnBind() 方法中返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/**
* 調用PushManager.startWork後,sdk將對push server發起綁定請求,這個過程是異步的。綁定請求的結果通過onBind返回。
* 如果您需要用單播推送,需要把這裏獲取的channel id和user id上傳到應用server中,再調用server接口用channel id和user id給單個手機或者用戶推送。
*
* @param context
* BroadcastReceiver的執行Context
* @param errorCode
* 綁定接口返回值,0 - 成功
* @param appid
* 應用id。errorCode非0時爲null
* @param userId
* 應用user id。errorCode非0時爲null
* @param channelId
* 應用channel id。errorCode非0時爲null
* @param requestId
* 向服務端發起的請求id。在追查問題時有用;
* @return
* none
*/
@Override
public void onBind(Context context, int errorCode, String appid,
String userId, String channelId, String requestId) {
String responseString = "onBind errorCode=" + errorCode + " appid="
+ appid + " userId=" + userId + " channelId=" + channelId
+ " requestId=" + requestId;
Log.e(TAG, responseString);
// 綁定成功,設置已綁定flag,可以有效的減少不必要的綁定請求
if (errorCode == 0) {
Utils.setBind(context, true);
Log.e(TAG, responseString+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
// Demo更新界面展示代碼,應用請在這裏加入自己的處理邏輯
updateContent(context, responseString);
}
|
接受通知後的處理方法,在通知沒有點擊前,是無法獲取通知內容的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/**
* 接收通知點擊的函數。注:推送通知被用戶點擊前,應用無法通過接口獲取通知的內容。
*
* @param context 上下文
* @param title 推送的通知的標題
* @param description 推送的通知的描述
* @param customContentString 自定義內容,爲空或者json字符串
*/
@Override
public void onNotificationClicked(Context context, String title,
String description, String customContentString) {
String notifyString = "通知點擊 title="" + title + "" description=""
+ description + "" customContent=" + customContentString;
Log.d(TAG, notifyString);
// 自定義內容獲取方式,mykey和myvalue對應通知推送時自定義內容中設置的鍵和值
if (customContentString != null & customContentString != "") {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo更新界面展示代碼,應用請在這裏加入自己的處理邏輯
updateContent(context, notifyString);
}
//customContentString 可以自定義通知的格式和內容
{
//android必選,ios可選
"title" : "hello" ,
“description: "hello world"
//android特有字段,可選
"notification_builder_id": 0,
"notification_basic_style": 7,
"open_type":0,
"net_support" : 1,
"user_confirm": 0,
"url": "http://developer.baidu.com",
"pkg_content":"",
"pkg_name" : "com.baidu.bccsclient",
"pkg_version":"0.1",
//android自定義字段
"custom_content": {
"key1":"value1",
"key2":"value2"
},
//ios特有字段,可選
"aps": {
"alert":"Message From Baidu Push",
"Sound":"",
"Badge":0
},
//ios的自定義字段
"key1":"value1",
"key2":"value2"
}
|
在MyPushMessageReceiver中,有幾個很重要的方法,設置標籤,刪除標籤,解除綁定等。
3.5.2 設置通知樣式
默認的通知欄,基本可以滿足需要的,要是想自定義,也有這樣的接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
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);
//爲什麼給的demo 中要搞這麼高深,偶也不知道。
CustomPushNotificationBuilder(1,2,3,4);四個參數 :1,layout 文件,2,通知欄圖標id 3,title id ,4, text id ,對應description 字段。
// 在這裏,我一定要大聲的告訴你。Notification,一定要設置icon ,不然就看不到下拉通知。因爲這個問題,我找了一天半呀!
|
還有兩個兩個方法,設置標籤,刪除標籤。
|
// Push: 刪除tag調用方式
List<String> tags = Utils.getTagsList(textviewGid.getText().toString());
PushManager.delTags(getApplicationContext(), tags);
// Push: 設置tag調用方式
List<String> tags = Utils.getTagsList(textviewGid.getText().toString());
PushManager.setTags(getApplicationContext(), tags);
|