Notification应用

作者: 墨革 | 来源:发表于2016-10-23 08:08 被阅读272次

    最基本的通知

    NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
    builder.setContentTitle("notification")
           .setContentText("this is content")
           .setSmallIcon(R.mipmap.ic_launcher);
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID,buidler.build());
    

    说明

    • 通常会选择用NotificationCompat来构建一个通知,以保证兼容性。
    • 一个通知必须为其设置上面的三个属性。但是我们自己通过ReomteViews来自定义通知布局时,可以不用设置前两个属性,但是必须setSmallIcon
    • NotificationManager有两个nofify()方法.notify(int id, Notification notification) ,notify(String tag, int id, Notification notification),其中tag和id用来唯一标识一个通知。

    一般混合通知

    下面这个通知是一个长文本通知。包括两个按钮,并且可以响应用户点击事件。内容比较杂。

    NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/"));
    PendingIntent pendingIntent = PendingIntent.getActivity(mContext,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    Intent sendMessage = new Intent(Intent.ACTION_VIEW,Uri.parse("sms:10086"));
    PendingIntent smpd = PendingIntent.getActivity(mContext,0,sendMessage,PendingIntent.FLAG_UPDATE_CURRENT);
    // 为通知设置长文本样式
    android.support.v4.app.NotificationCompat.BigTextStyle style = new android.support.v4.app.NotificationCompat.BigTextStyle();
    style.bigText(getResources().getString(R.string.note_text));
    style.setSummaryText("English Text");
    builder.setContentTitle("notification")
           .setContentText("this is content")
           .setSmallIcon(R.drawable.github)
           .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.github))
           .setTicker("hello")
           .setDefaults(Notification.DEFAULT_ALL)
           .setSound(Uri.parse("android:resource://" + context.getPackageName() + "/" + R.raw.msg))
           .setAutoCancel(true)
           .setContentIntent(pendingIntent)
           .setPriority(Notification.PRIORITY_MAX)
           .setStyle(style)
           .addAction(R.drawable.accept,"send",smpd)
           .addAction(R.drawable.decline,"cancel",null);
    Notification notification = builder.build();
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID,buidler.build());
    

    说明

    • 通过PendingIntent来包装Intent,然后调用builder的setContentIntent方法把PendingIntent传进去,响应用户的点击事件。
    • 通过setStyle来设置通知的样式。例如可以设置BigTextStyle,还可以设值MediaStyle
    • 通过addAction方法来给通知添加按钮,并设值响应事件。

    带进度条的通知

    final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
    final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    builder.setContentTitle("Downloading")
           .setSmallIcon(R.mipmap.ic_launcher);
    new Thread(new Runnable() {
        @Override
        public void run() {
          for (int i =0;i<100;i+=10){
          // 第三个参数如果设置为true,则不会显示精确的进度。
          builder.setProgress(100,i,false);
          manager.notify(NOTIFICATION_ID,builder.build());
          try {
                // 模拟下载
                Thread.sleep(3000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
                }
              }
      builder.setContentText("Complete")
          // 取消进度条
           .setProgress(0,0,false);
      manager.notify(NOTIFICATION_ID,builder.build());
      }
    }).start();
    

    自定义布局通知

    自定义布局同时主要是通过ReomteViews来实现.

    NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);  
    // 为RemotViews设置一个布局,这个布局需要自己在layout中实现。
    RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.notification);
    remoteViews.setTextViewText(R.id.text,"notification");
    remoteViews.setImageViewResource(R.id.image,R.drawable.git);
    builder.setSmallIcon(R.drawable.github);  
    // 将RemoteViews设置到通知中
    builder.setContent(remoteViews);
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID,builder.build());
    

    补充

    • RemoteViews是一个可以运行在其他进程中的View。通知是运行在系统进程的。
    • 如果需要为RemoteViews中的子View设置响应事件,可以通过remoteViews.setOnClickPendingIntent方法实现。
    • 上面通知的RemoteViews中有个TextView,如果要为它设置样式,可以在xml文件里添加一句android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title",这样它的样式就和系统一致了。

    悬挂式通知

    通知有五种优先级,范围从 PRIORITY_MIN (-2) 到 PRIORITY_MAX (2),如果未设置,则优先级默认为 PRIORITY_DEFAULT (0)。
    通过NotificationCompat.Builder.setPriority()来为通知设置优先级。当优先级大于默认的时候时,通知都可以在其他应用的上面,显示一个顶部悬挂的通知。

    通知的等级

    通知的等级有三个

    • VISIBILITY_PRIVATE, 表明当前通知只有在没有锁屏的时候才会显示。
    • VISIBILITY_PUBLIC, 任何情况下都可以显示。
    • VISIBILITY_SECRET, 在没有锁屏的情况下才会显示。

    通过NotificationCompat.Builder.setVisibility(VISIBILITY_PUBLIC),可以让通知在锁屏界面上显示。
    通过NotificationCompat.Builder.setCategory(Notification.CATEGORY_MESSAGE),可以控制通知的位置。

    相关文章

      网友评论

        本文标题:Notification应用

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