Android利用極光推送獲取到消息并緩存至本地

緩存的方式有多種,最常用的類似搜索記錄,這些用的數據庫比較多。
本文用的是一個數據庫框架GreenDao,正好也練習一下。

關于技術部分需要的操作也不是太多,無非包括兩部分:
一部分是在接到推送的消息的時候緩存,另一部分是在頁面的時候將消息展示出來。

但是有個缺點,數據清除了之后,除非自己去后臺查看記錄,不然就被清理掉了。

源碼在GitHub如果有介紹不清楚的地方以去查看
https://github.com/wapchief/android-CollectionDemo

關于GreenDao的介紹這里就不詳細描述了。
直接開始代碼部分。

1、需要集成GreenDao,和極光JPush兩個sdk。

Modle App:

apply plugin: 'org.greenrobot.greendao'
......
greendao {
    schemaVersion 1//數據庫版本號
    daoPackage 'wapchief.com.collectiondemo.greendao'//設置DaoMaster、DaoSession、Dao包名
    targetGenDir 'src/main/java'//設置DaoMaster、DaoSession、Dao目錄
    //targetGenDirTest:設置生成單元測試目錄
    //generateTests:設置自動生成單元測試用例
}
......
dependencies {
    compile 'cn.jiguang.sdk:jpush:3.0.3'  // 此處以JPush 3.0.3 版本為例。
    compile 'cn.jiguang.sdk:jcore:1.1.1'  // 此處以JCore 1.1.1 版本為例。
    compile 'org.greenrobot:greendao:3.2.0'
}

Project:

    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
        // in the individual module build.gradle files
    }

建議參考:
Android SDK 集成指南
GreenDao官方文檔

在集成GreenDao的時候有可能被墻,導致下載不下來,可以修改代理為127.0.0.1

2、創建實體類用于生成數據庫
/**
 * Created by Wu on 2017/5/11 0011 上午 9:24.
 * 描述:存放極光推送的消息
 */
@Entity
public class Message {

    @Id(autoincrement = true)
    private Long id;
    private String title;
    private String content;


    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

    @Generated(hash = 977969778)
    public Message(Long id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }

    @Generated(hash = 637306882)
    public Message() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

創建之后,運行Build > Make Module app,會生成數據庫操作的DAO類。
如果實體是Message,那么自動生成的就是MessageDao.

3、初始化數據庫相關
    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();
    }

4、在廣播器里操作

在集成JPush的時候需要在本地建立本地廣播繼承BroadcastReceiver,一般命名為MyReceiver

public class MyReceiver extends BroadcastReceiver{
    private static final String TAG = "JPush";
    MessageDao messageDao;
    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();
        //初始化數據庫
        initDbHelp();
        
.......

        else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下來的通知:"+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());
            //獲取當前時間
            String   str   =   formatter.format(curDate);
            messageDao.insert(new Message(null, str, content));

            Log.d(TAG, "[MyReceiver] 接收到推送下來的通知的ID: " + notifactionId);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用戶點擊打開了通知");

            //打開自定義的Activity
            Intent i = new Intent(context, MessageActivity.class);
            i.putExtras(bundle);
            //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
            context.startActivity(i);

        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用戶收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在這里根據 JPushInterface.EXTRA_EXTRA 的內容處理代碼,比如打開新的Activity, 打開一個網頁等..

        } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
        } else {
            Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
    }

我們所收到的推送就在這里進行處理。
通過JPushInterface.EXTRA_ALERT獲取系統推送的消息。
然后使用
messageDao.insert(new Message(null, str, content));
將消息存放到數據庫,為了區分,這里加了一個推送的時間。
這時候數據庫已經存在了該條消息。

還有個點擊通知的操作,一般是跳轉到消息列表或者詳情。
直接在里面寫事件即可。

5、在Activity里展示消息
    private void initview() {
        //查詢所有
        list = messageDao.queryBuilder().list();
        //list倒序排列
        Collections.reverse(list);
        adapter = new ItemTVAdapter(context, list);
        messageLv.setAdapter(adapter);
        adapter.notifyDataSetChanged();

    }

這里只需要一個簡單的查詢全部的語句就可以。

效果圖
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 推送技術產生場景: --服務器端主動性: 客戶端與服務器交互都是客戶端主動的, 服務器一般不能主動與客戶端進行數據...
    原軍鋒閱讀 34,763評論 4 60
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,766評論 25 708
  • 版本記錄 前言 ??現在很多APP都有推送功能,其中極光推送就是很多APP的首選。我們最近的幾個APP也是用的極光...
    刀客傳奇閱讀 8,463評論 0 8
  • 不同版本極光推送SDK集成各有差異,集成時一定要注意版本號,樓主已將博文更新成最新的SDK JPush v3.0....
    i順頌時宜閱讀 7,890評論 37 170
  • 帶娃神器有很多,最近解救我于水火之中的是背帶。 為了一家團聚,放暑假后候鳥似的從老家到了深圳。...
    嗨Pi麻閱讀 261評論 0 0