第一次用极光推送避免不了各种坑。总结一下。
关于架包引入
请先参考官方文档,
Android SDK 集成指南
这里文档说的是最新版架包在AndroidStudio中引入的方法,
直接可以在build中使用compile引入,并进行相关配置。
如果全部配置完成检查app中是否生成有.so文件,
注意:
包名必须是jniLibs,如果没有的话,或者目录下文件是空,可以在libs下
找到极光的jar包,把里面的这些文件全拷贝到jinLibs下,
如果是eclipse,则在libs目录下
如果遇到getRegistrationID为空等异常可以参考之前写的博客
《极光推送getRegistrationID为空,UnsatisfiedLinkError异常》
关于使用
因为是采用广播的方式完成推送,所以要写一个MyReceiver 继承BroadcastReceiver ,在这里面处理收到的系统通知,和自定义通知。
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
private NotificationManager nm;
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (null == nm) {
nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
}
Bundle bundle = intent.getExtras();
Logger.d(TAG, "onReceive - " + intent.getAction() + ", extras: " + AndroidUtil.printBundle(bundle));
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
Logger.d(TAG, "JPush用户注册成功");
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
Logger.d(TAG, "接受到推送下来的自定义消息");
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
Logger.d(TAG, "接受到推送下来的通知");
receivingNotification(context,bundle);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
Logger.d(TAG, "用户点击打开了通知");
openNotification(context,bundle);
} else {
Logger.d(TAG, "Unhandled intent - " + intent.getAction());
}
}
private void receivingNotification(Context context, Bundle bundle){
String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
Logger.d(TAG, " title : " + title);
String message = bundle.getString(JPushInterface.EXTRA_ALERT);
Logger.d(TAG, "message : " + message);
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
Logger.d(TAG, "extras : " + extras);
}
private void openNotification(Context context, Bundle bundle){
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
String myValue = "";
try {
JSONObject extrasJson = new JSONObject(extras);
myValue = extrasJson.optString("myKey");
} catch (Exception e) {
Logger.w(TAG, "Unexpected: extras is not a valid json", e);
return;
}
if (TYPE_THIS.equals(myValue)) {
Intent mIntent = new Intent(context, ThisActivity.class);
mIntent.putExtras(bundle);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
} else if (TYPE_ANOTHER.equals(myValue)){
Intent mIntent = new Intent(context, AnotherActivity.class);
mIntent.putExtras(bundle);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
}
这里有两个是常用的
自定义通知:
JPushInterface.ACTION_MESSAGE_RECEIVED
在这里可以进行一些ui上的实现,可以弹窗推送,比如有些系统提示维护的弹窗,或者一些不常用的但是又非常重要需要实时提示的可以自定义。
对系统通知的操作:
JPushInterface.ACTION_NOTIFICATION_OPENED
也就是处理系统栏的推送,
代码示例:
cn.jpush.android.intent.MESSAGE_RECEIVED, extras:
key:cn.jpush.android.EXTRA, value:{"pushinfo":{"money":0,"bid":"89510","btype":0,"bbid":"89510","messageid":"14768","pbid":0},"pushtype":"bills"}
key:cn.jpush.android.TITLE, value:您有新的奖金入帐
key:cn.jpush.android.MESSAGE, value:您有新的奖金入帐,奖金帐单流水号:89510!
key:cn.jpush.android.CONTENT_TYPE, value:type
key:cn.jpush.android.APPKEY, value:**********************
key:cn.jpush.android.MSG_ID, value:************
......
cn.jpush.android.intent.NOTIFICATION_RECEIVED, extras: key:cn.jpush.android.NOTIFICATION_DEVELOPER_ARG0, value:developerArg0
key:cn.jpush.android.ALERT, value:您有新的奖金入帐
key:cn.jpush.android.EXTRA, value:{}
key:cn.jpush.android.NOTIFICATION_ID, value:*********
key:cn.jpush.android.NOTIFICATION_CONTENT_TITLE, value:顺道嘉
key:cn.jpush.android.MSG_ID, value:**********
这里是后台返回的数据,我们要做的就是判断消息类型。
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
model = getEntityByJsonObject(extras);
获取我们所有的消息,然后解析存放到我们的model中。
需要用的时候直接调用
利用model判断消息类型。
这里的页面就是一个自定义的系统提示弹窗,在MESSAGE_RECEIVED中处理,收到推送后会弹出提示窗。
//极光自定义推送message消息类型,打开弹窗页面
if (model.pushtype.equals("message")){
if (AppManager.isAction(context)){
JPushModel.JPushMessage jpmsg = (JPushModel.JPushMessage) model.t;
Log.e("jpmsg----------------",jpmsg.toString());
mp1 = MediaPlayer.create(context,
getSystemDefultRingtoneUri());
mp1.start();
Intent i2 = new Intent(context, SMRZActivity.class);
i2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i2.putExtra("TITLE",
bundle.getString(JPushInterface.EXTRA_TITLE));
i2.putExtra("CONTENT",
bundle.getString(JPushInterface.EXTRA_MESSAGE));
i2.putExtra("isOk", jpmsg.isOk);
context.startActivity(i2);
}
同时,在NOTIFICATION_RECEIVED中设置系统通知的状态操作,
点击系统栏跳转到消息列表。
if (model.pushtype.equals("message")) {
JPushModel.JPushMessage jm = (JPushModel.JPushMessage) model.t;
if (jm.url.equals("")) {
Intent i = new Intent(context, MessageListActivity.class);
context.startActivity(i);
}else {
WebViewActivity.start(context, "活动", jm.url);
}
设置开关
设置开启/关闭推送
JPush已经为我们设置好了,直接调用就行了。
//关闭
JPushInterface.stopPush(getApplicationContext());
//开启
JPushInterface.resumePush(getApplicationContext());
极光后台
在极光管理后台,我们可以进行点对点,和一些自定义的推送。
RegistrationID可以使用JPushInterface.getRegistrationID(this);
获取。
能力有限,如果想详细了解极光可以去看官方文档
当然极光的功能也不仅仅局限于这些消息推送,后面还有即时通讯、短信验证码等。
附github:https://github.com/jpush
关于推送的其它用法:
极光征文 | 如何实现Emoji表情的推送😆
在BroadcastReceiver中利用推送设置全局弹窗,并将消息保存至本地
Android利用极光推送获取到消息并缓存至本地