美文网首页android基础安卓Android知识
安卓Notification,希望一篇就够

安卓Notification,希望一篇就够

作者: OpenDreamer | 来源:发表于2016-11-28 14:02 被阅读1856次

    我学习最快的方法就是先看效果,再想原理最后,将它实现。效果是最直观的,而且能够有效的判断所学的东西是不是想要的。现在网上的资料实在太杂,很多花了很多时间去研究,最后发现坑爹了,不是想要的。这篇文章首先会介绍能实现的主要功能。然后是解决问题的基本思想,接着是具体的一些实现。本篇文章和以前的风格有所不同,以前都是文章中代码比较少,附上demo,但发现这样可能不方便读者,所以采用了实现效果以及主要代码的形式。这种方式现在还在测试阶段,如果觉得以前的模式比较好或者其他更好的方式的话可以給我留言,以后的文章会做出相应的调整 。
    一、常见使用 使用实现步骤:
    1、准备跳转的intent ;
    2、配置NotificationCompat.Builder;
    3、发送通知 ;

    1.最简单的通知
    实现效果


    普通的通知
    //准备跳转的Intent 
    Intent jumpIntent=new Intent(context, MainActivity.class); 
    jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    //准备PendingIntent
    final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    //配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
    builder.setContentText(content)//设置内容
          .setContentTitle(title) //设置标题
          .setTicker(content) //设置状态栏的信息
          .setSmallIcon(R.mipmap.app_icon); 
          .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级
    builder.setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等
    //发通知
    final int mNotificationId = 1001; 
    NotificationManager mNotifyMgr =(NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); 
    mNotifyMgr.notify(mNotificationId, builder.build());
    
    

    2.宽视图文字样式

    实现效果:

    折叠效果 展开效果
    Intent jumpIntent=new Intent(context, MainActivity.class); 
    jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    //准备PendingIntent
    final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    //配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
    builder.setContentText(content) 
             .setContentTitle(title) 
             .setTicker(content) //设置状态栏的信息      
             .setSmallIcon(R.mipmap.app_icon); 
             .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级 
             .setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等 
    //有区别的地方 NotificationCompat.BigTextStyle bigTextStyle=new NotificationCompat.BigTextStyle(); 
    bigTextStyle.bigText(bigContent); 
    bigTextStyle.setBigContentTitle(title);
    builder.setStyle(bigTextStyle);
    builder.setContentText(content); 
    //发通知 final int mNotificationId = 1001; 
    NotificationManager mNotifyMgr =(NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); 
    mNotifyMgr.notify(mNotificationId, builder.build());
    

    3、宽视图图片模式
    实现效果

    折叠效果 展开效果
    Intent jumpIntent=new Intent(context, MainActivity.class); 
    jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    //准备PendingIntent 
    final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    //配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
    builder.setContentText(content) 
          .setContentTitle(title) 
          .setTicker(content) //设置状态栏的信息  
          .setSmallIcon(R.mipmap.app_icon);    
          .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级 
          .setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等 
    //有区别的地方 NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle(); 
    bigPictureStyle.bigPicture(resource); 
    builder.setStyle(bigPictureStyle);
    //发通知 final int mNotificationId = 1001; 
    NotificationManager mNotifyMgr =(NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); 
    mNotifyMgr.notify(mNotificationId, builder.build());
    

    4.自定义
    普通通知 实现效果 本来是想实现一个音乐播放器的,最后懒于找图标就实现了一个和普通通知一样的效果(原谅我的懒惰)

    自定义
    Intent jumpIntent=new Intent(context, MainActivity.class); 
    jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    //准备PendingIntent
     final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    //配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
    builder.setContentText(content) 
           .setContentTitle(title)
           .setTicker(content) //设置状态栏的信息 
           .setSmallIcon(R.mipmap.app_icon);    
           .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级
           .setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等
     //有区别的地方
     RemoteViews remoteViews=new  RemoteViews(context.getPackageName(), R.layout.widget_notification);//自定义布局 
    //自定义布局中的图片 
    remoteViews.setImageViewBitmap(R.id.iv_notification,resource); //自
    定义布局中的文字 
    remoteViews.setTextViewText(R.id.tv_notification_title,title); 
    remoteViews.setTextViewText(R.id.tv_notification,content); builder.setContent(remoteViews);
     //可以设置成折叠模式,但得判断一下sdk,大于16才能使用
     // builder.setCustomBigContentView(remoteViews);
    

    二、提升逼格
    1、字体适配背景色 适配原因:当自定义布局时,自定义的颜色很可能会和背景类似导致,看不清楚 适配方法:设置成系统默认系统背景, 字体颜色 说一下网上的常用方法 5.0一下:

    <TextView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/notification_widget_title" 
       android:textAppearance="@style/TextAppearance.StatusBar.EventContent" android:textSize="@dimen/d14sp"/>
    

    5.0以上:
    1.新建layout-v21文件夹
    2.代码设置

     <TextView android:layout_width="wrap_content" 
        android:layout_height="wrap_content"    
        android:text="@string/notification_widget_title"  
        android:textAppearance="@android:style/TextAppearance.Material.Notification.Title" android:textSize="14sp"/>
    

    虽然看上去挺靠谱,但其实这样适配是有问题的
    1三星 系统5.0

    适配前 适配后

    2.华为 系统5.1

    适配前 适配后

    3.小米 系统6.0

    适配前 适配后

    看了这几张图,就一个感觉摔手机,就一个通知弄出这么多的差异,这不坑人嘛。生无可念。而且坑爹的是适配以后效果更差了,适配的方法一点都靠谱,但网上一直使用着,着说明中间一定出现问题了,仔细一想,原生的在API21之前默认是黑色背景,之后默认是黑色背景。在一看配置果然有问题targetSdkVersion=19。也就是按api19来处理的,所以三星的才是黑色。于是把targetSdkVersion换成了21果然好使

    适配后

    于是,想华为的可能是这样,但残酷的现实告诉我华为的并没有按照规范,虽然5xitong.0以上了,但是它并没有按照规范来。哭死算了。综上几个测试,感觉还是暂时不要用这种方法适配。

    2.设置控件的点击事件 应用场景,播放器,常用的通知一般都是点一下就去某一个页面。而像酷我这样的播放器通常是有一些按钮,按钮有相应的事件,比如切换歌曲,暂停播放等。

     remoteViews.setOnClickPendingIntent() 
    //这个方法有两个参数,控件id和PendingIntent
    

    3.代码中设置控件颜色
    //第一个参数是控件名称,第二个是控件的方法,第三个是具体的值,使用时需要注意, 控件包含这个方法。否则可能导致整个通知不显示

    remoteViews.setInt(R.id.tv_notification,"setTextColor", Color.parseColor("#00ff00"));
    
    
    改变颜色

    这里单独提到这个是想通过这个方法去适配通知,比如代码中根据不同的api级别设置不同的颜色。但想一想安卓的碎片化也就放弃了。但用这个方法去实现一些个性话的样式还是不错的
    4.设置图标(360手机助手不同的通知图标)

    //第一个参数控件id,第二个参数bitmap 
    remoteViews.setImageViewBitmap(R.id.iv_notification,resource);
     //这里可以在推送内容中加上不同的网址,实现360手机助手的不同通知图标的效果
    

    三、小福利
    文章最后送上一个现在正在使用的推送格式

     { "title": "标题", 
       "type": "2",//type 打开不同页面 
       "content": "普通的消息内容", 
       "isClick":"true",//是否要点击事件
       "bigContent": "长内容", 
       "bigImageUrl":""//大图片地址 
       "iconUrl":""//图标地址(可以用于实现360手机助手不同图标)
       "webUrl": "https://www.baidu.com" }
    

    四、后记 本篇文章没有demo,没错就是没有(任性一回),本篇文章是一个新的尝试,如果你觉得以前的风格比较好或者有更好的风格可以給我建议。

    相关文章

      网友评论

      • jihf:我把笑话看完了:joy: :joy: :joy:
      • 湛兮似或存:这种风格好,一目了然 :+1:
      • 30d510f59682:我学习最快的方法就是先看效果,再想原理最后,将它实现。效果是最直观的,而且能够有效的判断所学的东西是不是想要的。
        楼主的风格,我喜欢!
      • d60971551f30:bigpicture模式我在4.4以上测试两个手机都失败了:cry:
        OpenDreamer:@gggl 两个手指放在通知栏上,然后下拉
        d60971551f30:@闯梦者 木有大图视图。只显示的title和content
        OpenDreamer:@gggl 失败是什么意思?没有相应api,还是没有大图视图?
      • 皮球二二:颜色的适配还是有办法的😁
        OpenDreamer:@r17171709 :+1: 代码适配是可以考虑的方法,但需要注意一下华为手机(安卓碎片化太严重)和目标sdk的设置。
        皮球二二:@闯梦者 http://www.jianshu.com/p/141fc999ac10 我之前也研究过,就是获取通知栏某一个文本的色值,根据这个色值判断到底应该采用白色背景还是黑色背景
        OpenDreamer:@r17171709 可以一起讨论一下

      本文标题:安卓Notification,希望一篇就够

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