zoukankan      html  css  js  c++  java
  • 腾讯信鸽自定义推送通知

    使用信鸽的过程,感觉一路艰辛,各种坑,想必各位使用过的也是深有体会的吧。而且官方文档也太简洁了。demo功能也不全,没办法只能自己摸索着来,这不刚把自定义通知弄明白,就给各位看官献上来了。

    1. XGPushManager功能类

    自定义本地通知样式 
    void setPushNotificationBuilder(Context context, int notificationBulderId, XGPushNotificationBuilder notificationBuilder) 
    本地通知,调用下面这个方法,就可以起来一个推送通知 
    long addLocalNotification(Context context, XGLocalMessage msg)

    2 如何自定义通知

    这里主要就是需要构造一个XGPushNotificationBuilder

    [代码]java代码:

    XGCustomPushNotificationBuilder build = new XGCustomPushNotificationBuilder();
        build.setSound(
                RingtoneManager.getActualDefaultRingtoneUri(
                        context, RingtoneManager.TYPE_ALARM)) // 设置声音
                        // setSound(
                        // Uri.parse("android.resource://" + getPackageName()
                        // + "/" + R.raw.wind)) 设定Raw下指定声音文件
                        .setDefaults(Notification.DEFAULT_VIBRATE) // 振动
                        .setFlags(Notification.FLAG_NO_CLEAR); // 是否可清除
        // 设置自定义通知layout,通知背景等可以在layout里设置
        build.setLayoutId(R.layout.layout_notification);
        // 设置自定义通知内容id
        build.setLayoutTextId(R.id.ssid);
        // 设置自定义通知标题id
        build.setLayoutTitleId(R.id.title);
        // 设置自定义通知图片id
        build.setLayoutIconId(R.id.icon);
        // 设置自定义通知图片资源
        build.setLayoutIconDrawableId(R.drawable.ic_launcher);
        // 设置状态栏的通知小图标
        build.setIcon(R.drawable.ic_launcher);
        // 设置时间id
        build.setLayoutTimeId(R.id.time);
        // 若不设定以上自定义layout,又想简单指定通知栏图片资源
        build.setNotificationLargeIcon(R.drawable.tenda_icon);

    3如何使用我们自定义的通知

    这个是替换默认的通知,build是上面的那段代码的,这样通知就是使用我们自定义的形式了。
    XGPushManager.setDefaultNotificationBuilder(context, build);
    

    4 启动本地通知

    [代码]java代码:

    XGLocalMessage  localMessage = new XGLocalMessage();
    XGPushManager.addLocalNotification(context, localMessage);

    5如何根据推送信息的不同,来显示不同的推送通知式样

    最初我总是入不了这个门,原因是没有理解到推送消息和推送通知的区别,如果我们要想使用自定义通知来显示,我们就需要使用推送消息,信鸽就只是将推送的内容传递过来,它说这是透传,然后用户根据这些消息,自己做自己想做的事情。 
    XGPushBaseReceiver类提供透传消息的接收和操作结果的反馈,需要开发者继承本类,并重载相关的方法; 
    void onTextMessage(Context context,XGPushTextMessage message)该方法就是接收透传消息的方法。这样我们需要写一个receiver来继承XGPushBaseReceiver,直接上代码了

    [代码]java代码:

    public class MessageReceiver extends XGPushBaseReceiver {
        private Intent intent = new    Intent("com.qq.xgdemo.activity.UPDATE_LISTVIEW");
     public static final String LogTag = "TPushReceiver";
    
    private void show(Context context, String text) {
        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
    }
    
    // 通知展示
    @Override
    public void onNotifactionShowedResult(Context context,
            XGPushShowedResult notifiShowedRlt) {
               if (context == null || notifiShowedRlt == null) {
                    return;
               }
    
        show(context, "您有1条新消息, " + "通知被展示 , " + notifiShowedRlt.toString());
    }
    
    @Override
    public void onUnregisterResult(Context context, int errorCode) {
        if (context == null) {
            return;
        }
        String text = "";
        if (errorCode == XGPushBaseReceiver.SUCCESS) {
            text = "反注册成功";
        } else {
            text = "反注册失败" + errorCode;
        }
        Log.d(LogTag, text);
        show(context, text);
    
    }
    
    @Override
    public void onSetTagResult(Context context, int errorCode, String tagName) {
        if (context == null) {
            return;
        }
        String text = "";
        if (errorCode == XGPushBaseReceiver.SUCCESS) {
            text = """ + tagName + ""设置成功";
        } else {
            text = """ + tagName + ""设置失败,错误码:" + errorCode;
        }
        Log.d(LogTag, text);
        show(context, text);
    
    }
    
    @Override
    public void onDeleteTagResult(Context context, int errorCode, String tagName) {
        if (context == null) {
            return;
        }
        String text = "";
        if (errorCode == XGPushBaseReceiver.SUCCESS) {
            text = """ + tagName + ""删除成功";
        } else {
            text = """ + tagName + ""删除失败,错误码:" + errorCode;
        }
        Log.d(LogTag, text);
        show(context, text);
    
    }
    
    // 通知点击回调 actionType=1为该消息被清除,actionType=0为该消息被点击
    @Override
    public void onNotifactionClickedResult(Context context,
            XGPushClickedResult message) {
        if (context == null || message == null) {
            return;
        }
        String text = "";
        sendIconCountMessage(context);
        samsungShortCut(context, "25");
        if (message.getActionType() == XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) {
            // 通知在通知栏被点击啦。。。。。
            // APP自己处理点击的相关动作
            // 这个动作可以在activity的onResume也能监听,请看第3点相关内容
            text = "通知被打开 :" + message;
        } else if (message.getActionType() == XGPushClickedResult.NOTIFACTION_DELETED_TYPE) {
            // 通知被清除啦。。。。
            // APP自己处理通知被清除后的相关动作
            text = "通知被清除 :" + message;
        }
        Toast.makeText(context, "广播接收到通知被点击:" + message.toString(),
                Toast.LENGTH_SHORT).show();
        // 获取自定义key-value
        String customContent = message.getCustomContent();
        if (customContent != null && customContent.length() != 0) {
            try {
                JSONObject obj = new JSONObject(customContent);
                // key1为前台配置的key
                if (!obj.isNull("ID")) {
                    String value = obj.getString("ID");
                    Log.d(LogTag, "get custom value:" + value);
                }
                // ...
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        // APP自主处理的过程。。。
        Log.d(LogTag, text);
        show(context, text);
    }
    
    @Override
    public void onRegisterResult(Context context, int errorCode,
            XGPushRegisterResult message) {
        // TODO Auto-generated method stub
        if (context == null || message == null) {
            return;
        }
        String text = "";
        if (errorCode == XGPushBaseReceiver.SUCCESS) {
            text = message + "注册成功";
            // 在这里拿token
            String token = message.getToken();
        } else {
            text = message + "注册失败,错误码:" + errorCode;
        }
        Log.d(LogTag, text);
        show(context, text);
    }
    
    // 消息透传
    @Override
    public void onTextMessage(Context context, XGPushTextMessage message) {
        // TODO Auto-generated method stub
        show(context, "haha");
        String text = "收到消息:" + message.toString();
        // 获取自定义key-value
        String customContent = message.getCustomContent();
        if (customContent != null && customContent.length() != 0) {
            try {
                JSONObject obj = new JSONObject(customContent);
                // key1为前台配置的key
                if (!obj.isNull("key")) {
                    String value = obj.getString("key");
                    Log.d(LogTag, "get custom value:" + value);
                }
                // ...
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        // APP自主处理消息的过程...
        XGLocalMessage  localMessage = new XGLocalMessage();
        localMessage.setTitle("haha");
        localMessage.setContent(message.getContent());
        XGCustomPushNotificationBuilder build = new XGCustomPushNotificationBuilder();
        build.setSound(
                RingtoneManager.getActualDefaultRingtoneUri(
                        context, RingtoneManager.TYPE_ALARM)) // 设置声音
                        // setSound(
                        // Uri.parse("android.resource://" + getPackageName()
                        // + "/" + R.raw.wind)) 设定Raw下指定声音文件
                        .setDefaults(Notification.DEFAULT_VIBRATE) // 振动
                        .setFlags(Notification.FLAG_NO_CLEAR); // 是否可清除
        // 设置自定义通知layout,通知背景等可以在layout里设置
        build.setLayoutId(R.layout.layout_notification);
        // 设置自定义通知内容id
        build.setLayoutTextId(R.id.ssid);
        // 设置自定义通知标题id
        build.setLayoutTitleId(R.id.title);
        // 设置自定义通知图片id
        build.setLayoutIconId(R.id.icon);
        // 设置自定义通知图片资源
        build.setLayoutIconDrawableId(R.drawable.ic_launcher);
        // 设置状态栏的通知小图标
        build.setIcon(R.drawable.ic_launcher);
        // 设置时间id
        build.setLayoutTimeId(R.id.time);
        // 若不设定以上自定义layout,又想简单指定通知栏图片资源
        build.setNotificationLargeIcon(R.drawable.tenda_icon);
        // 客户端保存build_id
        XGPushManager.setDefaultNotificationBuilder(context, build);
    
        XGPushManager.addLocalNotification(context, localMessage);
        Log.d(LogTag, text);
        show(context, text);
    }
    private void sendIconCountMessage(Context context)  {
        Intent it = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
        it.putExtra("android.intent.extra.update_application_component_name", "com.example.wujie.xungetest/.MainActivity");
        String iconCount = "50";
        it.putExtra("android.intent.extra.update_application_message_text", iconCount);
        context.sendBroadcast(it);
    }
    }

    这样就可以完美自定义了,觉得有用,就请顶一下,谢谢

  • 相关阅读:
    蓝桥杯Java真题解析
    第十届蓝桥杯JavaB组总结
    Java框架相关
    认识JDBC
    Lua中 MinXmlHttpRequest如何发送post方式数据
    ios 的EditBox点击空白处不隐藏的解决方案
    AssetsManager 在ios更新失败解决方案
    Cocos Studio编辑器运行日志路径
    华为 进入和退出Fastboot、eRecovery和Recovery升级模式
    cocos lua 加密方案
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5694138.html
Copyright © 2011-2022 走看看