安卓友盟推送集成过程详解(二)

2023-11-03

前言

经过上一篇的讲解,我们已经成功集成了PushSDK的推送功能,说的很详细相信大家也都测试成功了,从本篇开始我们将会接着上一篇继续讲解一些友盟推送的高级用法,还没有阅读上一篇的同学点击这里跳转哦。

灵活控制通知栏

1,设置通知栏图标
如果在发送后台没有指定通知栏图标,SDK将使用本地的默认图标,其中,大图标默认使用:drawable下的umeng_push_notification_default_large_icon,小图标默认使用drawable下的umeng_push_notification_default_small_icon。若开发者没有设置这两个图标,则默认使用应用的图标(),请确保应用设置了默认图标。

最佳实践:
为了提升展示效果和机型适配,推荐使用自定义通知栏图标。在drawable目录下,放置两张图片,分别命名为umeng_push_notification_default_large_icon和umeng_push_notification_default_small_icon。

1,小图标smallIcon要求为48 * 48像素,图片各边至少留一个像素的透明,图标主体使用颜色,背景均使用透明。
2,大图标largeIcon 要求为64 * 64像素。

注意:MIUI(小米手机)系统暂时无法支持自定义通知栏图标,若开发者有需求,也可通过自定义通知栏样式来解决。

2,自定义设置通知栏提示音
在项目的res/raw/下放置命名为umeng_push_notification_default_sound。若无此文件,则默认使用系统的Notification声音。

注意:
1,若需要在线(意思是在友盟消息后台)配置声音,则要先将对应的声音文件放置在res/raw目录下,然后在友盟发送后台提醒方式选择自定义声音,设置为raw目录下的声音文件,即R.raw.[sound]里的sound,如下图:
在这里插入图片描述
2,自定义通知栏声音仅在Android 8.0以下机型生效,如需适配Android 8.0及以上版本,请参考下面自定义通知栏样式,重写getNotification方法,设置声音。

3,通知提示音、震动及呼吸灯控制
响铃、震动及呼吸灯可以分别通过以下三个接口单独设置控制方式:
MsgConstant.NOTIFICATION_PLAY_SERVER(服务端控制)
MsgConstant.NOTIFICATIONPLAYSDKENABLE(客户端允许)
MsgConstant.NOTIFICATIONPLAYSDKDISABLE(客户端禁止)
服务端控制:通过服务端推送状态来设置客户端响铃、震动、呼吸灯的状态
客户端允许:不关心服务端推送状态,客户端都会响铃、震动、呼吸灯亮
客户端禁止:不关心服务端推送状态,客户端不会响铃、震动、呼吸灯亮

使用案例:消息到达后,声音状态由服务端控制,客户端控制呼吸灯点亮,客户端禁止手机震动:

mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SERVER); //服务端控制声音
mPushAgent.setNotificationPlayLights(MsgConstant.NOTIFICATIONPLAYSDKENABLE);//客户端允许呼吸灯点亮
mPushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATIONPLAYSDKDISABLE);//客户端禁止振动

4,设置是否显示通知
默认在友盟后台发送的通知成功送达时,都会回调UmengMessageHandler类的dealWithNotificationMessage方法。我们可以在Application的onCreate方法中添加如下代码进行验证:

UmengMessageHandler messageHandler = new UmengMessageHandler() {
            /**
             * 通知的回调方法
             * @param context
             * @param msg
             */
            @Override
            public void dealWithNotificationMessage(Context context, UMessage msg) {
                // 调用super则会默认的展示通知,不调用super则不展示通知
                // super.dealWithNotificationMessage(context, msg);
                new Handler(getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, "通知到达了,但是我不想让他展示", Toast.LENGTH_SHORT).show();
                    }
                });
            }
}
mPushAgent.setMessageHandler(messageHandler);

注释掉上面的super调用代码,改为打印一个提示,然后重新在后台发送一个通知,发现没有通知提示,只是弹出了一条吐司,一般该方法不需要修改,保持默认的调用super即可。

5,设置应用在前台运行时是否显示通知
如果您的应用在前台,您可以设置不显示通知栏消息。默认情况下,应用在前台是显示通知的。 开发者更改前台通知显示设置后,会根据更改生效。若要不显示前台通知,调用接口如下:

mPushAgent.setNotificaitonOnForeground(false);

注意:此方法请在mPushAgent.register方法之前调用。

6,自定义通知栏样式
在PushSDK里,UmengMessageHandler类负责处理消息,包括通知和自定义消息。其中,成员函数getNotification负责定义通知栏样式。若SDK默认的消息展示样式不符合开发者的需求,可通过覆盖该方法来自定义通知栏展示样式。
可以在application的onCreate方法中添加如下代码:

UmengMessageHandler messageHandler = new UmengMessageHandler() {

    @Override
    public Notification getNotification(Context context, UMessage msg) {
        switch (msg.builder_id) {
            case 1:
                Notification.Builder builder = new Notification.Builder(context);
                RemoteViews myNotificationView = new RemoteViews(context.getPackageName(), 
                    R.layout.notification_view);       
                // 下面四个id均为R.layout.notification_view布局中的组件
                // 如果对自定义通知栏不是很了解,建议查询相关资料
                myNotificationView.setTextViewText(R.id.notification_title, msg.title);
                myNotificationView.setTextViewText(R.id.notification_text, msg.text);
                myNotificationView.setImageViewBitmap(R.id.notification_large_icon, 
                    getLargeIcon(context, msg));
                myNotificationView.setImageViewResource(R.id.notification_small_icon, 
                    getSmallIconId(context, msg));
                builder.setContent(myNotificationView)
                       .setSmallIcon(getSmallIconId(context, msg))
                       .setTicker(msg.ticker)
                       .setAutoCancel(true);

                return builder.getNotification();
            default:
                //默认为0,若填写的builder_id并不存在,也使用默认。
                return super.getNotification(context, msg);
        }
    }
};
mPushAgent.setMessageHandler(messageHandler);

msg.builder_id用来指定通知消息的样式,在后台发送通知时,如果展示样式选择默认样式那么该值默认为0,也可以选择定制样式,然后输入定制的样式编号(只允许输入0~99之间的整数),如下图所示:
在这里插入图片描述
注意:每当有通知送达时,均会回调getNotification方法,因此可以通过监听此方法来判断通知是否送达。

7,通知免打扰模式
为免过度打扰用户,SDK默认在“23:00”到“7:00”之间收到通知消息时不响铃,不振动,不闪灯。如果需要改变默认的静音时间,可以使用以下接口:

public void setNoDisturbMode(int startHour, int startMinute, int endHour, int endMinute)
// 例如:
mPushAgent.setNoDisturbMode(22, 0, 3, 0);
// 可以通过下面的设置,来关闭免打扰模式:
mPushAgent.setNoDisturbMode(0, 0, 0, 0);

默认情况下,同一台设备在1分钟内收到同一个应用的多条通知时,不会重复提醒,同时在通知栏里新的通知会替换掉旧的通知。可以通过如下方法来设置冷却时间:

mPushAgent.setMuteDurationSeconds(int seconds);

8,设置通知栏显示数量
通知栏可以设置最多显示通知的条数:

public void setDisplayNotificationNumber(int number);

当通知栏显示数目大于设置值,此时再有新通知到达时,会把旧的一条通知隐藏,例如设置通知栏最多显示两条通知,当通知栏已经有两条通知,此时若第三条通知到达,则会把第一条通知隐藏。
1,参数number可以设置为0~10之间任意整数。当参数为0时,表示不合并通知。
2,该方法可以多次调用,以最后一次调用时的设置为准。


关于在后台发送广播时的4个后续操作及自定义参数

在这里插入图片描述
1,打开应用:指的是当手机接收到推送的通知时,如果此时应用在后运行,那么点击该通知,应用将展示在前台,如果应用本来就在前台展示着,那么点击该通知没有任何效果。
2,打开连接:制定一个网址,当点击该通知时,将自动打开手机浏览器跳转到该网页。
3,跳转到指定Activity:填入点击此通知需要打开的Activity的完整路径,即包名+类名,需要注意的是,需要为打开的acticity设置android:launchMode=“singleTask”,否则点击通知不会成功跳转。
4,自定义行为:我们可以将指定的内容通过通知传递给应用进行解析,自定义行为的数据内容存放在UMessage.custom字段中。若开发者需要处理自定义行为,则可以重写方法dealWithCustomAction()。请在自定义Application类中添加以下代码:

UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {

    @Override
    public void dealWithCustomAction(Context context, UMessage msg) {
        Toast.makeText(context, "自定义行为的内容为"+msg.custom, Toast.LENGTH_LONG).show();
    }
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);

注意:
1,请在自定义Application中调用此接口,如果在Activity中调用,当应用进程关闭情况下,设置无效;
2,UmengNotificationClickHandler是在BroadcastReceiver中被调用,因此若需启动Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK(相当于启动模式为singleTask),否则无法启动Activity。
5,自定义参数
当我们在【友盟+】后台推送通知和自定义消息时,都可以添加自定义参数,每个参数均以键值对的形式共同组成一个Map集合,通过extra字段发送到客户端,在Android客户端我们有以下几种方案来获取友盟后台下发的extra属性对应的Map对象:
方案一:通知到达时获取自定义参数。重写UmengMessageHandler类中的getNotification(Context context, UMessage msg)方法:
前面我们提到过:每当有通知送达时,均会回调getNotification方法。

UmengMessageHandler messageHandler = new UmengMessageHandler() {

    @Override
    public Notification getNotification(Context context, UMessage msg) {

        for (Map.Entry entry : msg.extra.entrySet()) {

            Object key = entry.getKey();
            Object value = entry.getValue();

        }
        return super.getNotification(context, msg);
    }
};
mPushAgent.setMessageHandler(messageHandler);

方案二:通知被点击时获取自定义参数。通过重写UmengNotificationClickHandler类中的launchApp、openUrl、openActivity、dealWithCustomAction方法,均可以从msg.extra中获取自定义参数:

UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {

    @Override
    public void launchApp(Context context, UMessage msg) {
        super.launchApp(context, msg);
    }

    @Override
    public void openUrl(Context context, UMessage msg) {
        super.openUrl(context, msg);
    }

    @Override
    public void openActivity(Context context, UMessage msg) {
        super.openActivity(context, msg);
    }

    @Override
    public void dealWithCustomAction(Context context, UMessage msg) {
        Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
    }
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);

例如点击通知时,根据map的value值选择跳转到不同的Activity:

UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
        @Override
        public void dealWithCustomAction(Context context, UMessage msg) {
            Map<String, String> extra = msg.extra;
            if (extra.get("activityType").equals("1")) {
                Intent intent = new Intent(context, MessCenterActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            } else {
                Intent intent = new Intent(context, InformationActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        }
    };
    mPushAgent.setNotificationClickHandler(notificationClickHandler);

方案三:进入Activity时获取自定义参数。若您使用Push SDK的默认设置处理通知消息,则从服务端传的自定义参数将会通过Intent传递给相应的Activity,您可以在相应的Activity中的onResume()方法内通过以下代码获得传递的参数:

Bundle bun = getIntent().getExtras();

if (bun != null) {

    Set<String> keySet = bun.keySet();
    for (String key : keySet) {
        String value = bun.getString(key);
        ...
    }

}

注意:如果在Activity中获取自定义参数,则需要将该Activity的launchMode设置为android:launchMode=”singleTask”,并重写onNewIntent方法:

@Override

protected void onNewIntent(Intent intent) {

    super.onNewIntent(intent);
    setIntent(intent);

}

自定义消息(消息透传)

自定义消息不是通知,默认不会被展示到通知栏上,自定义消息可以用于应用的内部业务逻辑和特殊展示需求。

若开发者要使用自定义消息,则需重在自定义Application类的onCreate() 中重写dealWithCustomMessage()方法,自定义消息的内容存放在UMessage.custom字段里。代码如下所示:

UmengMessageHandler messageHandler = new UmengMessageHandler(){

    @Override
    public void dealWithCustomMessage(final Context context, final UMessage msg) {
        new Handler(getMainLooper()).post(new Runnable() {

            @Override
            public void run() { 
                // 对于自定义消息,PushSDK默认只统计送达。若开发者需要统计点击和忽略,则需手动调用统计方法。
                boolean isClickOrDismissed = true;
                if(isClickOrDismissed) {
                    //自定义消息的点击统计
                    UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);
                } else {
                    //自定义消息的忽略统计
                    UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);
                }
                Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
            }
        });
    }
};

mPushAgent.setMessageHandler(messageHandler);

如果在Activity中调用此接口,若应用进程关闭, 则设置的接口将会无效。


应用内消息以及小米华为推送通道集成见官方文档最末尾部分

https://developer.umeng.com/docs/66632/detail/66744


标签(Tag),加权标签,与别名(Alias)

标签 可以给某一类人群推送消息,别名 可以给指定用户推送消息。
最佳实践:
1,客户端开发者在应用内调用 addTags 或者 addAlias来设置对应关系;
2,【友盟+】消息后台存储相应的关系设置;
3,在友盟后台推送消息时,指定向之前设置过的别名或者标签推送。

设置用户标签

您可以为用户加上标签,方便推送时按照标签来筛选。例如:

mPushAgent.getTagManager().addTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
        //isSuccess表示操作是否成功
    }

}, "movie", "sport");

目前每个用户tag限制在1024个, 每个tag 最大128字符。
注意:tag名称请不要加入URL Encode等变换处理,请使用原生字符串。
1,添加标签
在原有标签基础上增加新标签。

mPushAgent.getTagManager().addTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

}, String... tags);

2,删除标签
将之前添加的标签中的一个或多个删除。

mPushAgent.getTagManager().deleteTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

}, String... tags);

3,获取服务器端的所有标签

mPushAgent.getTagManager().getTags(new TagManager.TagListCallBack() {

    @Override
    public void onMessage(boolean isSuccess, List<String> result) {

    }

});

设置用户加权标签

加权标签是给标签增加了一个权值。例如点击了“财经”栏目,就给该用户“财经”标签增加相应权值。推送消息时,可以选择“财经”标签权值大于某个值的用户来进行推送。加权标签是用户标签的高级玩法,可以圈定更精准的客户人群。

1,添加加权标签
在原有标签基础上增加新加权标签,权值(value)需大于等于-10,小于等于10

public void addWeightedTags(TCallBack callBack, Hashtable<String, Integer> hashtable)

例如:

Hashtable<String, Integer> hashtable = new Hashtable<String, Integer>();
hashtable.put("财经", 5);
mPushAgent.getTagManager().addWeightedTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

}, hashtable);

2,删除加权标签
将之前添加的加权标签中的一个或多个删除。

public void deleteWeightedTags(final TCallBack callBack, final String... tags)

例如:

mPushAgent.getTagManager().deleteWeightedTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

}, "weighted_tag1", "weighted_tag2");

3,获取服务器端的所有加权标签

public void getWeightedTags(WeightedTagListCallBack callBack)

例如:

mPushAgent.getTagManager().getWeightedTags(new WeightedTagListCallBack() {
            @Override
            public void onMessage(boolean isSuccess, final Hashtable<String, Integer> result) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        });

设置用户别名(Alias)

如果你的应用有自有的用户id体系,可以在SDK中通过Alias字段上传自有用户id,按用户id向用户推送消息。用户id可以是你的应用为每个用户自动生成的唯一id,也可以是用户采用第三方平台登录时从第三方平台获取到的用户id。要设置用户ID,可以使用以下接口。设置用户id和device_token的一对多的映射关系:

mPushAgent.addAlias("zhangsan@sina.com", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});

设置用户id和device_token的一一映射关系,确保同一个alias只对应一台设备:

mPushAgent.setAlias("zhangsan@sina.com", ALIAS_TYPE.SINA_WEIBO, 

new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});

若是要移除用户id,可调用以下接口:

mPushAgent.deleteAlias("zhangsan@sina.com", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack(){

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});

若要使用新的alias,请先调用deleteAlias接口移除掉旧的alias,再调用addAlias添加新的alias,代码如下所示:

mPushAgent.deleteAlias("old@sina.com", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack() {

   @Override

   public void onMessage(boolean isSuccess, String message) {

   }

});

mPushAgent.addAlias("new@sina.com", ALIAS_TYPE.SINA_WEIBO, new UTrack.ICallBack() {

   @Override

   public void onMessage(boolean isSuccess, String message) {

   }

});

注意:
1,若要使用新的alias,请先调用deleteAlias接口移除掉旧的alias,再调用addAlias添加新的alias;
2,设置alias时需要指定该alias对应的类型(alias type),例如:自有id、新浪微博、腾讯微博、豆瓣等;
3,alias名称请不要使用URLEncode等变换处理,请使用原生字符串;
4,alias的绑定是需要获取到deviceToken为前提的,最好是在注册即enable的回调接口中进行alias的绑定,此时可以保证获取到deviceToken;
5,alias原有的addExclusiveAlias和removeAlias接口均已废弃,请使用新接口
6,alias的更多玩法请参考:“Alias”是什么, 该如何使用?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓友盟推送集成过程详解(二) 的相关文章

随机推荐