【极光推送Jpush】Android集成极光推送及其基本使用
Jpush接收到推送通知,保存到数据库,然后列表展示
写的不好,还望见谅,不对地方,多多指教。
先给出效果图:
在官网推送内容:
手机接收到通知
点击,跳转到展示页面
1、集成Jpush
(1)创建应用,输入包名,下载demo,给出官方链接http://docs.jiguang.cn/jpush/console/Instructions/
(2)手动集成,导入必要文件,给出官方链接 http://docs.jiguang.cn/jpush/client/Android/android_guide/
倒入两个jar,
导入so文件,
复制 res/ 中drawable-hdpi, layout, values文件夹中的资源文件到你的工程中 res/ 对应同名的目录下
(3)配置 AndroidManifest.xml
1)添加权限(注意更改包名)
2)复制核心代码(注意更改包名以及appkey)
(4) 创建你自己的广播接收MyReceiver
/** * 自定义接收器 * * 如果不定义这个 Receiver,则: * 1) 默认用户会打开主界面 * 2) 接收不到自定义消息 */public class MyReceiver extends BroadcastReceiver { private static final String TAG = "JPush"; private List list = new ArrayList<>(); public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId); } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { Log.d(TAG, "收到了自定义消息。消息内容是:" + bundle.getString(JPushInterface.EXTRA_MESSAGE)); // 自定义消息不会展示在通知栏,完全要开发者写代码去处理 String content = bundle.getString(JPushInterface.EXTRA_MESSAGE); Toast.makeText(context, content, Toast.LENGTH_SHORT).show(); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { // 在这里可以做些统计,或者做些其他工作 } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { String content = bundle.getString(JPushInterface.EXTRA_ALERT);//此处,我们取出的是通知的内容。还可以取出别的信息,这个大家可自行处理// 在这里可以自己写代码去定义用户点击后的行为 Intent i = new Intent(context, TestActivity.class); i.putExtra("content", content); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } else { } }}
注意: i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
是需要设置的
此外,当你接收到推送的通知。点击就跳转Activity,所以最好设置一下Activity的启动方式为singleTask
(在TestActivity中接受值的时候,有一点需要注意,稍后会说到)
(5)集成 JPush Android SDK 的混淆
请下载4.x及以上版本的proguard.jar, 并替换你Android Sdk “tools\proguard\lib\proguard.jar”
请在工程的混淆文件中添加以下配置:
-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { ; }
-dontwarn cn.jiguang.*
-keep class cn.jiguang.** { *; }
v2.0.5 ~ v2.1.7 版本有引入 gson 和 protobuf ,增加排除混淆的配置。(2.1.8版本不需配置)
gson && protobuf========
-dontwarn com.google.**
-keep class com.google.gson.** {;}
-keep class com.google.protobuf.** {;}
(6)注册(最好在application中注册)
JPushInterface.init(this);
此时,启动程序,已经可以接受服务器或者jpush官网推送的消息了(我们接下来将推送的通知 取出来,存入数据库)
2构建数据库
(1)MySQLiteOpenHelper类
/** * @describe: * @author: Gao Chunfa. * @time: 2017/4/8-11:14. */public class MySQLiteOpenHelper extends SQLiteOpenHelper { private static final String NAME = "mysqlite.db"; private static final int VERSION = 1; public MySQLiteOpenHelper(Context context) { super(context, NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { String sql = "create table if not exists message(_id integer primary key autoincrement,content varchar,time long)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
(2)SqlDao
/** * @describe:增加,查询 * @author: Gao Chunfa. * @time: 2017/4/8-11:22. */public class SqlDao { private MySQLiteOpenHelper helper; private SQLiteDatabase db; public SqlDao(Context context) { helper = new MySQLiteOpenHelper(context); }//只做最简单的增加和查询操作,大家可自行操作 //增加 public void add(String message) { db = helper.getWritableDatabase(); String sql = "insert into message (content , time) values (?,?)"; db.execSQL(sql, new String[]{message, System.currentTimeMillis() + ""}); db.close(); }//查询 public List find() { List list = new ArrayList<>(); db = helper.getReadableDatabase(); Cursor cursor = db.query("message", null, null, null, null, null, "time desc", "10"); while (cursor.moveToNext()) { list.add(cursor.getString(cursor.getColumnIndex("content"))); } cursor.close(); db.close(); return list; }}
(3)TestActivity(用来展示列表)
public class TestActivity extends AppCompatActivity { private ListView listView; private SqlDao dao; private List list = new ArrayList<>(); private String content; private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); listView = (ListView) findViewById(R.id.listView); dao = new SqlDao(this); adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list); listView.setAdapter(adapter); content = getIntent().getStringExtra("content"); if (!content.equals("")){ dao.add(content); } list.clear(); list.addAll(dao.find()); adapter.notifyDataSetChanged(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); content = getIntent().getStringExtra("content"); if (!content.equals("")){ dao.add(content); } list.clear(); list.addAll(dao.find()); adapter.notifyDataSetChanged(); }}
因为之前说到。我们设置启动方式为singleTask;所以当你第二次点击进入该页面(即该回退栈中已经有
该页面的时候),他不会执行onCreate方法,而是执行onNewIntent()方法,所以。我们在这两
个方法中均作了取值操作,然后刷新adapter;此外,activity的getIntent()方法只是获取activity原来的
intent。我们还需要在onNewIntent()方法中重载一下:setIntent(intent);,要不然,接收到的数据
依然为空。
这就是大体一个流程,很多操作都可以根据实际情况而做处理。
更多相关文章
- 利用makefile的语法功能,查看Android中Android.mk里面的变量的值
- Android(安卓)核心分析 -----IPC框架分析 Binder,Service,Service
- Android(安卓)App实现仅有横屏切换功能或仅有竖屏切换功能
- Android(安卓)简单实现倒计时功能
- Android(安卓)studio禁用启动时自动更新SDK功能
- OpenERP Android(安卓)DEMO工程发布下载
- android实现一个简单的加法功能
- [Android] Dalvik opcodes
- Android(安卓)配置PhoneGap开发环境