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();

    }

这里只需要一个简单的查询全部的语句就可以。

效果图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 推送技术产生场景: --服务器端主动性: 客户端与服务器交互都是客户端主动的, 服务器一般不能主动与客户端进行数据...
    原军锋阅读 34,921评论 4 60
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,615评论 25 709
  • 版本记录 前言   现在很多APP都有推送功能,其中极光推送就是很多APP的首选。我们最近的几个APP也是用的极光...
    刀客传奇阅读 8,561评论 0 8
  • 不同版本极光推送SDK集成各有差异,集成时一定要注意版本号,楼主已将博文更新成最新的SDK JPush v3.0....
    i顺颂时宜阅读 7,944评论 37 170
  • 带娃神器有很多,最近解救我于水火之中的是背带。 为了一家团聚,放暑假后候鸟似的从老家到了深圳。...
    嗨Pi麻阅读 274评论 0 0