Android 极光推送3.0.3版本自定义Receiver以及
2019-05-16 本文已影响0人
乐观极速蜗牛
目前极光推送的船新版本是3.0.3,具体的集成步骤就不多说了,按照官网的步骤来就可以了.
之前用自定义的消息去写,那么自己就要写通知,当时的思路是在自定义的消息里面去写,这样拓展程度高.自己定义的receiver如下:
public class MyPushReceiver extends BroadcastReceiver {
private static final String TAG = "HaoTest";
private int buiderID = 0;
private String activity = "";//要打开的activity名称
private String productId = "";//要打开的商品ID
private String storeId = "";//要打开的店铺ID
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.d(TAG, "onReceive - " + intent.getAction());
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));
//接收到了自定义消息,自定义消息不会展示在通知栏,完全要开发者写代码去处理
//消息的title
String title = bundle.getString(JPushInterface.EXTRA_TITLE);
//消息的内容
String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
//消息的ID,可用于上报统计
String MSG_ID = bundle.getString(JPushInterface.EXTRA_MSG_ID);
//消息的附加字段,是个json字符串
String json = bundle.getString(JPushInterface.EXTRA_EXTRA);
if (!MiscUtils.isEmpty(json)) {
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(json);
activity = jsonObject.getString("activity");
Log.d(TAG,"拿到的activity是 " + activity);
} catch (JSONException e) {
e.printStackTrace();
}
try {
productId = jsonObject.getString("productId");
Log.d(TAG,"拿到的productId是 " + productId);
} catch (JSONException e) {
e.printStackTrace();
}
try {
storeId = jsonObject.getString("storeId");
Log.d(TAG,"拿到的storeId是 " + storeId);
} catch (JSONException e) {
e.printStackTrace();
}
if (!MiscUtils.isEquals(activity,"")) {
//根据自定义消息里面传来的activity的值,设置点击通知打开特定的Activity
if (MiscUtils.isEquals(activity,"0")) {
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), MainActivity.class);
makeMyNotification("商城",message,intent0);
}
}else if (!MiscUtils.isEquals(storeId,"")){
//将String类型的店铺ID转化成int类型的ID
int ID = Integer.parseInt(storeId);
//根据自定义消息里面传来的storeId的值,设置点击通知打开特定ID的店铺界面
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), ShopStoreActivity.class);
intent0.putExtra("STOREID", ID);
makeMyNotification("商城",message,intent0);
}else if (!MiscUtils.isEquals(productId,"")){
//将String类型的商品ID转化成int类型的ID
int ID = Integer.parseInt(productId);
//根据自定义消息里面传来的productId的值,设置点击通知打开特定ID的商品详情界面
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), ProductDetailActivity.class);
intent0.putExtra("ProductDetailID",ID);
makeMyNotification("商城",message,intent0);
}
}
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
Log.d(TAG, "收到了通知");
//用户收到了通知,不是点击
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
Log.d(TAG, "用户点击打开了通知");
//用户点击了通知,在这里处理用户点击消息事件
//消息的title
String title = bundle.getString(JPushInterface.EXTRA_TITLE);
//消息的内容
String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
//消息的ID,可用于上报统计
String MSG_ID = bundle.getString(JPushInterface.EXTRA_MSG_ID);
//消息的附加字段,是个json字符串
String json = bundle.getString(JPushInterface.EXTRA_EXTRA);
if (!MiscUtils.isEmpty(json)) {
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(json);
activity = jsonObject.getString("activity");
Log.d(TAG,"拿到的activity是 " + activity);
} catch (JSONException e) {
e.printStackTrace();
}
try {
productId = jsonObject.getString("productId");
Log.d(TAG,"拿到的productId是 " + productId);
} catch (JSONException e) {
e.printStackTrace();
}
try {
storeId = jsonObject.getString("storeId");
Log.d(TAG,"拿到的storeId是 " + storeId);
} catch (JSONException e) {
e.printStackTrace();
}
if (!MiscUtils.isEquals(activity,"")) {
//根据自定义消息里面传来的activity的值,设置点击通知打开特定的Activity
if (MiscUtils.isEquals(activity,"0")) {
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), MainActivity.class);
LSConfig.getCurrentActivity().startActivity(intent0);
}
}else if (!MiscUtils.isEquals(storeId,"")){
//将String类型的店铺ID转化成int类型的ID
int ID = Integer.parseInt(storeId);
//根据自定义消息里面传来的storeId的值,设置点击通知打开特定ID的店铺界面
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), ShopStoreActivity.class);
intent0.putExtra("STOREID", ID);
LSConfig.getCurrentActivity().startActivity(intent0);
}else if (!MiscUtils.isEquals(productId,"")){
//将String类型的商品ID转化成int类型的ID
int ID = Integer.parseInt(productId);
//根据自定义消息里面传来的productId的值,设置点击通知打开特定ID的商品详情界面
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), ProductDetailActivity.class);
intent0.putExtra("ProductDetailID",ID);
LSConfig.getCurrentActivity().startActivity(intent0);
}
}else {
//没有带附加内容就直接打开首页
Intent intent0 = new Intent(LSConfig.getCurrentActivity(), MainActivity.class);
LSConfig.getCurrentActivity().startActivity(intent0);
}
} else {
Log.d(TAG, "Unhandled intent - " + intent.getAction());
}
}
private void makeMyNotification(String title,String content,Intent push){
Notification.Builder builder = null;
//第一步:获取状态通知栏管理:
NotificationManager mNotifyMgr = (NotificationManager)
LSConfig.getCurrentActivity().getSystemService(Context.NOTIFICATION_SERVICE);//获取状态栏通知的管理类(负责发通知、清除通知等操作)
//第二步:实例化通知栏构造器Notification.Builder:
//判断是否是8.0Android.O,要使得APP能在Android8.0中显示通知,需要进行版本判断,然后给builder设置Channel:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel chan1 = new NotificationChannel("static", "Primary Channel", NotificationManager.IMPORTANCE_HIGH);
mNotifyMgr.createNotificationChannel(chan1);
//实例化通知栏构造器Notification.Builder,参数必填(Context类型),为创建实例的上下文
builder = new Notification.Builder(LSConfig.getCurrentActivity(), "static");
} else {
//实例化通知栏构造器Notification.Builder,参数必填(Context类型),为创建实例的上下文
builder = new Notification.Builder(LSConfig.getCurrentActivity());
}
//第三步:设置通知栏PendingIntent(点击动作事件等都包含在这里):
// Intent push = new Intent(LSConfig.getCurrentActivity(),MainActivity.class);//新建一个显式意图,第一个参数 Context 的解释是用于获得 package name,以便找到第二个参数 Class 的位置
//PendingIntent可以看做是对Intent的包装,通过名称可以看出PendingIntent用于处理即将发生的意图,而Intent用来用来处理马上发生的意图
//本程序用来响应点击通知的打开应用,第二个参数非常重要,点击notification 进入到activity, 使用到pendingIntent类方法,PengdingIntent.getActivity()的第二个参数,即请求参数,实际上是通过该参数来区别不同的Intent的,如果id相同,就会覆盖掉之前的Intent了
PendingIntent contentIntent = PendingIntent.getActivity(LSConfig.getCurrentActivity(),0,push,PendingIntent.FLAG_CANCEL_CURRENT);
//第四步:对Builder进行配置:
builder
.setContentTitle(title)//标题
.setContentText(content)// 详细内容
.setContentIntent(contentIntent)//设置点击意图
.setTicker(title)//第一次推送,角标旁边显示的内容
.setAutoCancel(true)//设置这个标志当用户单击面板就可以将通知取消
.setLargeIcon(BitmapFactory.decodeResource(LSConfig.getCurrentActivity().getResources(), R.mipmap.ic_launcher))
.setDefaults(Notification.DEFAULT_ALL);//打开呼吸灯,声音,震动,触发系统默认行为
/*Notification.DEFAULT_VIBRATE //添加默认震动提醒 需要VIBRATE permission
Notification.DEFAULT_SOUND //添加默认声音提醒
Notification.DEFAULT_LIGHTS//添加默认三色灯提醒
Notification.DEFAULT_ALL//添加默认以上3种全部提醒*/
//.setLights(Color.YELLOW, 300, 0)//单独设置呼吸灯,一般三种颜色:红,绿,蓝,经测试,小米支持黄色
//.setSound(url)//单独设置声音
//.setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })//单独设置震动
//比较手机sdk版本与Android 5.0 Lollipop的sdk
if(android.os.Build.VERSION.SDK_INT>= android.os.Build.VERSION_CODES.LOLLIPOP) {
builder
/*android5.0加入了一种新的模式Notification的显示等级,共有三种:
VISIBILITY_PUBLIC只有在没有锁屏时会显示通知
VISIBILITY_PRIVATE任何情况都会显示通知
VISIBILITY_SECRET在安全锁和没有锁屏的情况下显示通知*/
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
.setCategory(Notification.CATEGORY_MESSAGE)//设置通知类别
//.setColor(context.getResources().getColor(R.color.small_icon_bg_color))//设置smallIcon的背景色
.setFullScreenIntent(contentIntent, true)//将Notification变为悬挂式Notification
.setSmallIcon(R.mipmap.ic_launcher);//设置小图标
}
else{
builder
.setSmallIcon(R.mipmap.ic_launcher);//设置小图标
}
//第五步:发送通知请求:
Notification notify = builder.build();//得到一个Notification对象
mNotifyMgr.notify(buiderID,notify);//发送通知请求
}
}
结果到最后,感觉还是用极光的推送好一些,我在小米4的测试机上面测试自定义的消息,当自定义的推送消息推送过来的时候,不需要点击就执行了这个自定义消息的点击意图,不知道为什么,在别的模拟器上面没有发现这个问题,然后自己写的Notification也有缺陷,悬浮式通知不能自己隐藏,而且自己写的通知只能显示一条,新推送的消息会覆盖掉上一条,应该是 mNotifyMgr.notify(buiderID,notify);的时候没有指定不同的buiderID,可以将buiderID每次都指定不同的,这样应该就不会覆盖了,但是没有去验证.