美文网首页AndroidAndroid程序员
关于JPush极光推送的基本用法和通知介绍

关于JPush极光推送的基本用法和通知介绍

作者: 八怪不姓丑 | 来源:发表于2017-03-23 11:29 被阅读3901次

    第一次用极光推送避免不了各种坑。总结一下。

    关于架包引入
    请先参考官方文档,
    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

    相关文章

      网友评论

      本文标题:关于JPush极光推送的基本用法和通知介绍

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