說說極光推送那些事

序言:今天看打開騰訊體育的時候,還沒徹底打開就收到了一條推送,而後對推送這個東西就產生了興趣,由於以前沒有弄過推送,因此就想着寫一篇博客來記錄一下學習推送的過程。

首先,百度android推送,這個時候會出來一堆關於推送的信息:html

一、極光推送java

二、信鴿推送android

三、融雲推送git

四、亞馬遜AWS推送github

等等數據庫

這裏我選擇了一個程序猿們比較經常使用的極光推送,好,先上效果圖:後端

左邊是Java後端,集成了JPush,簡單寫了一個jsp頁面,供咱們推送自定義消息,右邊是咱們的客戶端,用來接收JPush的推送。若是對java後端不知道着手寫的同窗請參考個人另外三篇博客:api

android開發怎麼少的了後端(上)服務器

android開發怎麼少的了後端(中)jsp

android開發怎麼少的了後端(下)

好了,來看咱們今天的demo:

一、首先客戶端就一個登陸界面和一個首頁,登陸以後再給該用戶推送

二、服務端也有一個界面,用來發送自定義推送,並且咱們給它設定一個篩選機制,這個篩選機制咱們在下面講數據庫的時候再說

關於客戶端極光推送的集成,在這裏我說幾點:

一、登陸的時候咱們須要設置極光推送的別名alias和標籤tag,以便咱們能接收到JPush的推送,aliastag是極光推送須要的,別名alias,官網上給的解釋是爲安裝了應用程序的用戶,取個別名來標識。之後給該用戶Push消息時,就能夠用此別名來指定。每一個用戶只能指定一個別名;標籤tag,官網上給的解釋是爲安裝了應用程序的用戶,打上標籤。其目的主要是方便開發者根據標籤,來批量下發Push消息。可爲每一個用戶打多個標籤。

btnLogin.setOnClickListener(new View.OnClickListener(){
	@Override
   public void onClick(View v) {
   	//一、登陸——>請求服務器
   	//二、登陸成功以後,設置極光推送
   	setJPush();
   }
});

private void setJPush(){
	String alias;
	String tags;
	Set<String> tagSet=new HashSet<>(Arrays.asList(tags));
	//給極光推送設置標籤和別名
    JPushInterface.setAliasAndTags(this, alias, tagSet, tagAliasCallback);
}
複製代碼

而後就是一個極光推送設置別名和標籤的回調:

//極光服務器設置別名是否成功的回調
private final TagAliasCallback tagAliasCallback = new TagAliasCallback() {
    @Override
    public void gotResult(int code, String alias, Set<String> tagSet) {
        switch (code) {
            case 0:
                Log.i("TAG", "設置別名成功");
                break;
            default:
                Log.i("TAG", "設置別名失敗");
                break;
        }
    }
};
複製代碼

二、由於別名要求惟一性,因此別名通常是你手機的UID,若是你不想在你下線以後還能收到推送,那麼再你下線的時候將別名設置爲空 關於別名的,詳情請參考極光推送別名與標籤API

客戶端的集成,官網講的很詳細,在這裏我就不細說了,詳情請參考極光推送 Android SDK 概述

####這裏咱們看看服務端的集成: 一、數據庫表的建立:

在這裏咱們有6個字段,咱們來看後面三個字段的含義,因爲咱們模擬的是商場會員積分推送的場景,因此count表示用戶的積分,咱們前面的演示也是根據積分來發推送通知的;而後aliastag是極光推送須要的,上文咱們已經解釋過aliastag的含義了。

而後咱們來看推送的服務端,首先新建一個Servlet,供咱們推送用:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	response.setHeader("Content-Type", "text/html;charset=UTF-8");
	request.setCharacterEncoding("UTF-8");
	int count = Integer.valueOf(request.getParameter("count"));
	String message = request.getParameter("message");
	MyDBTools myDBTools = new MyDBTools();
	ResultSet rs = null;
	if (count > -1 && !message.isEmpty()) {
		// 從數據庫中獲取全部的積分大於count的用戶,從而進行推送消息
		myDBTools.openConnect();
		rs = myDBTools.getUserCountInfo(count);
		try {
			while (rs.next()) {
				// 獲取這個用戶的別名
				String alias = rs.getString("alias");
				// 告訴極光服務器,這個用戶須要推送
				PushUtils.sendPushMessage(alias, "自定義JPush通知", message);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	myDBTools.closeConnect();
}
複製代碼

而後是我寫的一個PushUtil的一個輔助類,咱們先來看**sendPushMessage()**這個方法:

/**
 * 發送推送
 * @param alias 別名
 * @param title 推送標題
 * @param msg 推送消息
 * @return
 */
public static PushResult sendPushMessage(String alias, String title, String msg) {
	JPushClient jClient = new JPushClient(MASTER_SECRET, APP_KEY);
	// 構建推送的對象
	PushPayload pushPayload = buildByAlias(alias, title, msg);
	try {
		PushResult pr = jClient.sendPush(pushPayload);
		System.out.println("PushResult===" + pr);
		return pr;
	} catch (APIConnectionException | APIRequestException e) {
		e.printStackTrace();
	}
	return null;
}
複製代碼

注:上述的MASTER_SECRETAPP_KEY是在極光推送後臺你建立應用的時候會生成的,咱們這裏是根據別名來推送的,你還能夠根據標籤來推送。

而後咱們來看**buildByAlias()**這個方法:

/**
 * 構建推送的對象:全部對象
 * 
 * @param alias 推送目標:別名爲alias
 * @param title 推送標題
 * @param msg 推送內容
 * @return
 */
public static PushPayload buildByAlias(String alias, String title, String msg) {
	Map<String, String> map = new HashMap<>();
	map.put("url", "http://www.baidu.com");
	return PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.alias(alias))
			.setNotification(Notification.android(title, msg, map)).build();
}
複製代碼

注:上述中的map集合是你推送時候的附屬消息,像我這上面的附屬消息就是傳遞一個url,等你獲取通知的時候能夠獲取到這個url,而後打開通知以後能夠打開這個url

好了,推送的客戶端和服務端就講到這裏了,詳細的代碼我已經傳到GitHub上了,因爲Eclipse上傳GitHub失敗了(以前沒有傳過,懂的朋友麻煩教教我),因此服務端的我就放到百度雲上了

點我下載客戶端

點我下載服務端

公衆號:Android技術經驗分享
相關文章
相關標籤/搜索