zoukankan      html  css  js  c++  java
  • Android技巧小结之新旧版本Notification

    最近开发用到了通知功能,但有几个地方老是提示deprecated,然后就找了篇文章学习了下新旧版本的不同。

    Notification即通知,用于在通知栏显示提示信息。

    在较新的版本中(API level  > 11),Notification类中的一些方法被Android声明deprecated(弃用),其实基本上相当于全部弃用了,因为这个类本身方法就少得可怜。

    Android官方声明弃用,一定有它的理由,虽然我也不知道是什么。奈何本人轻度强迫症患者,人家都建议你不要用了,那就不要老是恪守着N年前的东西了。

    就像是以前,一说到标签页,大家基本上都会想到TabHost配合ActivityGroup,但Android后来提倡Fragment。

    废话说多了,还是小结一下使用方法。下面按照创建一个通知的步骤一步一步来,同时给出新旧实现方法。

    1、获取Notification管理器

    NotificationManager noteMng = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    2、新建一个Notification,设置状态栏显示样式

    private Notification note;
    //API 11以下
    note = new Notification(R.drawable.ico_launcher "显示于屏幕顶端状态栏的文本", System.currentTimeMillis());
    //API 11及以上
    Notification.Builder builder = new Notification.Builder(nowContext).setTicker("显示于屏幕顶端状态栏的文本")
    .setSmallIcon(R.drawable.ic_laucher);

    API 11以上版本中,状态栏显示的样式跟下拉通知栏中显示的样式,可以一起设置,就是通过Notification.Builder类来实现,这里的Builder只调用了两个方法来设置状态栏显示样式。

    3、设置Notification标志位(非必要步骤)
    //FLAG_ONGOING_EVENT表明有程序在运行,该Notification不可由用户清除
    note.flags = Notification.FLAG_ONGOING_EVENT;

    4、设置点击Notification后的触发事件
    //通过Intent,使得点击Notification之后会启动新的Activity
    Intent i = new Intent(nowContext, AnotherActivity.class);
    //该标志位表示如果Intent要启动的Activity在栈顶,则无须创建新的实例
    i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(nowContext, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

    5、设置Notification在通知栏里的样式
    (1)系统默认样式
    //API 11以下:
    note.setLatestEventInfo(nowContext, "take me to your heart", "Micheal learn to rock", pendingIntent);

    //API 16及以上,build()方法要求API 16及以上

    //一会API 11以上,一会API16以上,我也很想知道Android的API是怎么设计的
    note = builder.setContentIntent(pendingIntent).setContentTitle("title").setContentText("text").build();

    (2)自定义样式:

    自定义样式,就是让Notification在通知栏显示成自定义的xml布局
    应当注意的是,Notification的自定义样式,只支持以下可视组件:
    FrameLayout, LinearLayout, RelativeLayout
    TextView, Button, AnalogClock, ImageView, ImageButton, Chronometer, ProgressBar

    RemoteView view = new RemoteView(nowActivity.getPackageName(), R.layout.note_layout);
    //API 11以下
    note.contentView = view;
    note.contentIntent = pendingIntent;
    //API 16及以上,又是build()方法导致的,汗。。
    note = builder.setContent(view).setContentIntent(pendingIntent).build();

    这个步骤里有一个很值得注意的地方:pendingIntent被设置为note的contentIntent的值,就意味着点击了这个通知才会触发该Intent。

    那么如果只是想让自定义布局里的某个按钮触发呢?比如说,弄了一个音乐播放器,Service负责播放音乐,Notification显示当前播放进度和一些简单的暂停按钮、上一首、下一首按钮,让用户不用再打开界面就可以通过Notification上的按钮操纵音乐播放。

    假设说想让自定义布局里的一个id为R.id.button1的按钮来触发这个Intent,可以如下操作:

    view.setOnClickPendingIntent(R.id.button1, pendingIntent);//在上面创建RemoteView实例后加上这句

    然后注意,pendingIntent已经绑定到按钮上了,上面Notificatiion实例中,设置contentIntent的语句要去掉。

    6、发布该通知,第一个参数为该notification的ID
    noteMng.notify(10, note);

    在编码的时候,如果你的minSdkVersion设置的不符合,会立即提示你的。所以你要考虑下要满足的最小版本情况,具体可以根据当时的各个版本的占有量来衡量下,当然了,希望大家推进新版本的使用,尽量用新版本的开发代码进行开发。

    如果采用新版本的android16版本以下的在安装的时候就会提示Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]。这个就是因为设置的minSdkVersion太大的原因。如果兼容的话改成小些的版本号就可以安装了。

  • 相关阅读:
    多文件程序编译时头文件的使用方法
    360浏览器等被金山毒霸网强制霸占问题解决
    surface重装系统后,屏幕亮度不能调节,显示适配器出现黄色三角、windows hello不能正常使用
    Failed to execute "C:learnC程序练习1.exe": Error 0: 操作成功完成。 请按任意键继续. . .问题解决
    递归总结及斐波那契数列的实现
    在SpingBoot中使用Redis对接口进行限流
    在SpringBoot App中使用GoogleReCaptcha3过滤非法的请求
    在springboot中使用Guava基于令牌桶实现限流
    springboot jwt redis实现token刷新
    使用spring-validation和@RequestParam(required = false)字符串默认值的校验问题
  • 原文地址:https://www.cnblogs.com/wayne173/p/4152901.html
Copyright © 2011-2022 走看看