描述:
1蕾盯、在app中收到推送幕屹,自動(dòng)彈出窗口,顯示推送內(nèi)容级遭。
2望拖、選擇是否保存消息,是>存到消息列表數(shù)據(jù)庫(kù)挫鸽。否>dimiss说敏。
用到的庫(kù):
1、極光推送JPush
2丢郊、GreenDao數(shù)據(jù)庫(kù)
相關(guān)閱讀:
Android利用極光推送獲取到消息并緩存至本地
關(guān)于JPush極光推送的基本用法和通知介紹
GreenDao+SearchView+FlowLoyout實(shí)現(xiàn)搜索歷史和熱門搜索
為了區(qū)別手動(dòng)保存的和自動(dòng)保存的在時(shí)間前面加了“手動(dòng)”盔沫。
在收到推送之后會(huì)在兩個(gè)地方保存医咨,一個(gè)是對(duì)話窗口,一個(gè)是在Service
這里的彈窗并不是dialog架诞,因?yàn)橐獜棾鰀ialog需要依附存在的活動(dòng)拟淮。
在網(wǎng)上搜了一堆也沒(méi)能找到合適的辦法。
這里的用的彈窗其實(shí)是基于activity寫(xiě)的谴忧,當(dāng)然也可以在收到消息后很泊,進(jìn)入到一個(gè)新的activity,然后判斷推送設(shè)置是否彈窗口沾谓。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_jpush_message);
ButterKnife.bind(this);
initDbHelp();
initView();
}
布局就是要顯示的對(duì)話框撑蚌。
這里就不寫(xiě)源碼了。需要的可以去Github查看
初始化數(shù)據(jù)庫(kù)的方法:
有三個(gè)地方需要初始化搏屑,一個(gè)是自定義的MyService争涌、一個(gè)是收到消息的彈窗頁(yè)面,還有一個(gè)是消息列表辣恋。
對(duì)數(shù)據(jù)庫(kù)的操作只需要調(diào)用messageDao的相關(guān)增亮垫、刪、改伟骨、查方法饮潦。
/*初始化數(shù)據(jù)庫(kù)相關(guān)*/
private void initDbHelp() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(BaseApplication.mBaseApplication, "recluse-db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
messageDao = daoSession.getMessageDao();
}
推送用的是極光,在收到推送消息后携狭,首先在Receiver中處理继蜡,可以直接保存,
并且自動(dòng)打開(kāi)一個(gè)窗口逛腿,再選擇是否手動(dòng)保存稀并。
為了區(qū)別消息,放了一個(gè)日期单默,一并存入數(shù)據(jù)庫(kù)
else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
Log.d(TAG, "[MyReceiver] 接收到推送下來(lái)的通知:" + bundle.getString(JPushInterface.EXTRA_ALERT));
String content = bundle.getString(JPushInterface.EXTRA_ALERT);
int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());
//獲取當(dāng)前時(shí)間
String str = formatter.format(curDate);
//自動(dòng)保存至數(shù)據(jù)庫(kù)
messageDao.insert(new Message(null, str, content));
//打開(kāi)數(shù)據(jù)庫(kù)彈窗碘举,手動(dòng)選擇是否保存
Intent intent1 = new Intent(context, JPushDialogActivity.class);
intent1.putExtra("MESSAGE", content);
context.startActivity(intent1);
在彈出的窗口顯示消息內(nèi)容,并且可以手動(dòng)選擇是否保存搁廓,
private void initView() {
if (getIntent().hasExtra("MESSAGE"))
message = getIntent().getStringExtra("MESSAGE");
dialogMessage.setText("收到的推送:"+message);
}
最后監(jiān)聽(tīng)彈窗按鈕:
如果選擇了保存按鈕引颈,則緩存到本地?cái)?shù)據(jù)庫(kù),并且跳轉(zhuǎn)到消息列表
case R.id.dialog_yes:
Intent intent = new Intent(this, MessageActivity.class);
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());
//獲取當(dāng)前時(shí)間
String str = formatter.format(curDate);
messageDao.insert(new Message(null, "手動(dòng):" + str, message));
startActivity(intent);
break;
最后在消息列表中查詢所有的消息境蜕,添加到listview展示出來(lái)
private void initview() {
//查詢所有
list = messageDao.queryBuilder().list();
//list倒序排列
Collections.reverse(list);
adapter = new ItemTVAdapter(context, list);
messageLv.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
需要注意的地方:
1蝙场、數(shù)據(jù)庫(kù)的實(shí)例化,在什么地方需要操作就在什么地方實(shí)例化粱年。有個(gè)缺點(diǎn)是每次都要重復(fù)的復(fù)制過(guò)去售滤,后續(xù)會(huì)解決下這個(gè)問(wèn)題。
2逼泣、能正常推送的情況是必須保持app后臺(tái)運(yùn)行趴泌,并且在應(yīng)用管理開(kāi)啟了推送的開(kāi)關(guān)舟舒,才能收到推送。彈窗的話是應(yīng)用必須在前臺(tái)嗜憔,可見(jiàn)狀態(tài)才會(huì)彈窗秃励。
如果活動(dòng)被清理掉是收不到推送的。
而且這里的推送是我手動(dòng)在極光后臺(tái)操作的吉捶,需要測(cè)試的話可以自己去極光申請(qǐng)自己的項(xiàng)目夺鲜。