美文网首页
Android 极光推送3.0.3版本自定义Receiver以及

Android 极光推送3.0.3版本自定义Receiver以及

作者: 乐观极速蜗牛 | 来源:发表于2019-05-16 10:55 被阅读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每次都指定不同的,这样应该就不会覆盖了,但是没有去验证.

相关文章

网友评论

      本文标题:Android 极光推送3.0.3版本自定义Receiver以及

      本文链接:https://www.haomeiwen.com/subject/veubaqtx.html