在維護Bmob消息推送SDK的時候,有不少開發者會問到如何給某類用戶進行推送,例如,在教學類的應用中你須要對60分如下的同窗進行推送提醒,鼓勵他們努力學習。下邊我就詳細闡述一下:git
_User表結構github
屬性 | 類型 | 說明 |
---|---|---|
username | String | 用戶名 |
password | String | 密碼 |
score | Integer | 該用戶的分數 |
role | Integer | 該用戶的角色,0:老師,1:學生 |
_Installation表結構數據庫
屬性 | 類型 | 說明 |
---|---|---|
installationId | String | 設備惟一標誌,SDK自動生成 |
user | Pointer<_User> | 該設備當前登陸用戶 |
在用戶角色爲老師的狀況下,具備推送給其餘客戶端消息的功能,首先查詢角色爲學生的分數在60分如下的用戶,在根據查詢的結果做爲推送的條件進行推送。(爲了簡單理解,學生的分數會在註冊的時候自動隨機生成,在實際項目中須要老師爲學生打分。)後端
/** * 修改設備表的用戶信息:先查詢設備表中的數據,再修改數據中用戶信息 * * @param user */ private void modifyInstallationUser(final User user) { BmobQuery<Installation> bmobQuery = new BmobQuery<>(); final String id = BmobInstallationManager.getInstallationId(); bmobQuery.addWhereEqualTo("installationId", id); bmobQuery.findObjectsObservable(Installation.class) .subscribe(new Action1<List<Installation>>() { @Override public void call(List<Installation> installations) { if (installations.size() > 0) { Installation installation = installations.get(0); installation.setUser(user); installation.updateObservable() .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { toastI("更新設備用戶信息成功!"); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { toastE("更新設備用戶信息失敗:" + throwable.getMessage()); } }); } else { toastE("後臺不存在此設備Id的數據,請確認此設備Id是否正確!\n" + id); } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { toastE("查詢設備數據失敗:" + throwable.getMessage()); } }); }
/** * 修改設備表的用戶信息:先查詢設備表中的數據,再修改數據中用戶信息 */ private void modifyInstallationUser() { BmobQuery<Installation> bmobQuery = new BmobQuery<>(); final String id = BmobInstallationManager.getInstallationId(); bmobQuery.addWhereEqualTo("installationId", id); bmobQuery.findObjectsObservable(Installation.class) .subscribe(new Action1<List<Installation>>() { @Override public void call(List<Installation> installations) { if (installations.size() > 0) { Installation installation = installations.get(0); User user = new User(); installation.setUser(user); user.setObjectId(""); installation.updateObservable() .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { toastI("更新設備用戶信息成功!"); /** * TODO 更新成功以後再退出 */ BmobUser.logOut(); startActivity(new Intent(mContext, LoginActivity.class)); finish(); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { toastE("更新設備用戶信息失敗:" + throwable.getMessage()); } }); } else { toastE("後臺不存在此設備Id的數據,請確認此設備Id是否正確!\n" + id); } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { toastE("查詢設備數據失敗:" + throwable.getMessage()); } }); }
BmobQuery<User> bmobQueryUser = new BmobQuery<>(); bmobQueryUser.addWhereEqualTo("role",1); bmobQueryUser.addWhereLessThan("score",60); bmobQueryUser.findObjects(new FindListener<User>() { @Override public void done(List<User> list, BmobException e) { if (e==null){ for (User user:list){ BmobPushManager bmobPushManager = new BmobPushManager(); BmobQuery<BmobInstallation> query = BmobInstallation.getQuery(); query.addWhereEqualTo("user", user); bmobPushManager.setQuery(query); bmobPushManager.pushMessage("努力加油", new PushListener() { @Override public void done(BmobException e) { if (e == null) { Logger.e("推送成功!"); } else { Logger.e("異常:" + e.getMessage()); } } }); } }else { toastE(e.getMessage()); } } });
Demo下載地址:https://github.com/chaozhouzh...ide