Android学习笔记--Notification的使用-- 自定义布局

1.默认用法

一个 Notification 的必要属性有三项,如果不设置则在运行时会抛出异常:

    小图标,通过 setSmallIcon() 方法设置
    标题,通过 setContentTitle() 方法设置
    内容,通过 setContentText() 方法设置

下面,我们就来创建一个简单的 Notification 。主要有以下三步:

    获取 NotificationManager 实例
    实例化 NotificationCompat.Builder 并设置相关属性
    通过 builder.build() 方法生成 Notification 对象,并发送通知


 mBuilder.setContentTitle("测试标题")//设置通知栏标题  
               .setContentText("测试内容") //设置通知栏显示内容
               .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图  
            // .setNumber(number) //设置通知集合的数量  
              .setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的  
              .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间  
              .setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级  
           // .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消    

              .setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)

                                                       或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)     

              .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前

                                                                                         默认设置,使用defaults属性,可以组合

                                                                                       //Notification.DEFAULT_ALL

                                                                                         Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission 

             .setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON

2.自定义通知RemoteViews,使用自定义布局

RemoteViews表示的是一个View结构,它可以在其他进程中(系统的SystemServer进程)显示,为了能够更新它的界面,RemoteViews提供了一组基础操作用于跨进程更新。

// 创建 Notification.Builder 对象
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getContext());

RemoteViews contentview = new RemoteViews(getContext().getPackageName(), R.layout.notificationview);
contentview.setImageViewResource(R.id.iv_content, R.drawable.tu1);
contentview.setTextViewText(R.id.tv_content, "你收到一条新信息");
contentview.setTextViewText(R.id.tv_number, "2");

SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
Date date=new Date(System.currentTimeMillis());
String time=dateFormat.format(date);

contentview.setTextViewText(R.id.tv_when,time);

int requestcode = (int) System.currentTimeMillis() / 1000;
Intent intentclose=new Intent("com.example.k555l.testtwo.action.closenotice");//打开广播服务用于清除信息,需要注册
intentclose.putExtra("notice_ID",requestcode);

PendingIntent pendingIntent=PendingIntent.getBroadcast(getContext(),requestcode,intentclose,PendingIntent.FLAG_UPDATE_CURRENT);
contentview.setOnClickPendingIntent(R.id.tv_close,pendingIntent);//设置点击事件

Intent intent = new Intent(getContext(), MainActivity.class);
PendingIntent pendingIntent1 = PendingIntent.getActivity(getContext(), requestcode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pendingIntent1);//点击通知相应意图



mBuilder.setSmallIcon(R.drawable.tu1);
mBuilder.setAutoCancel(true);//点击通知后自动清除
mBuilder.setPriority(Notification.PRIORITY_DEFAULT);//优先级
mBuilder.setDefaults(Notification.DEFAULT_SOUND);//通知的效果
mBuilder.setContent(contentview);
NotificationManager manager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(requestcode, mBuilder.build());

广播信息处理

public class CloseNotice extends BroadcastReceiver {//要在AndroidManifest注册广播
    @Override
    public void onReceive(Context context, Intent intent) {
       int id= intent.getIntExtra("notice_ID",-1);
        if (id!=-1){
            NotificationManager manager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
            manager.cancel(id);//清除通知
            Toast.makeText(context,"close",Toast.LENGTH_LONG).show();
        }
    }
}



定义通知呢有一点需要注意就是,这个自定义的布局里的TextView字体的大小和颜色需要合理地配置,不然很容易在不同系统中和其他app的通知展示方式不一样,导致用户通知栏因为这个而显得不美观,甚至很突兀。那么,官方也是有给我们提供这样的解决方案:
    Android 5.0之前可用:  
    android:style/TextAppearance.StatusBar.EventContent.Title    // 通知标题样式    
    android:style/TextAppearance.StatusBar.EventContent             // 通知内容样式    
      
    Android 5.0及更高版本:    
    android:style/TextAppearance.Material.Notification.Title         // 通知标题样式    
    android:style/TextAppearance.Material.Notification                  // 通知内容样式  
<LinearLayout
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="0dp"
        android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Info"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="content"
        android:textSize="18sp" />
    <TextView
        android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Info"
        android:id="@+id/tv_close"
        android:textColor="#fe1110"
        android:layout_gravity="right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="close"
        android:textSize="18sp" />
</LinearLayout>

关于PendingIntent

PendingIntent可以看做是对Intent的包装,通过名称可以看出PendingIntent用于处理即将发生的意图,而Intent用来用来处理马上发生的意图。而对于通知来说,它是一系统级的全局通知,并不确定这个意图被执行的时间。当在应用外部执行PendingIntent时,因为它保存了触发应用的Context,使得外部应用可以如在当前应用中一样,执行PendingIntent里的Intent,就算执行的时候响应通知的应用已经被销毁了,也可以通过存在PendingIntent里的Context照常执行它,并且还可以处理Intent说带来的额外信息。
PendingInteng.getBroadcast(contex, requestCode, intent, flags)//打开广播
PendingInteng.getService(contex, requestCode, intent, flags)//打开服务
PendingInteng.getActivity(contex, requestCode, intent, flags)//打开activity
PendingInteng.getActivities(contex, requestCode, intent, flags)
其中flags属性参数:
FLAG_ONE_SHOT 表示返回的PendingIntent仅能执行一次,执行完后自动消失
FLAG_NO_CREATE 表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL
FLAG_CANCEL_CURRENT 表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent
FLAG_UPDATE_CURRENT 表示更新的PendingIntent,如果构建的PendingIntent已经存在,则替换它。

移除通知  

在使用NotificationManager.notify()发送通知的时候,需要传递一个标识符,用于唯一标识这个通知。

Android为我们提供两种方式移除通知,一种是Notification自己维护,使用setAutoCancel()方法设置是否维护,传递一个boolean类型的数据。另外一种方式使用NotificationManager通知管理器对象来维护,它通过notify()发送通知的时候,指定的通知标识Id来操作通知,可以使用cancel(int)来移除一个指定的通知,也可以使用cancelAll()移除所有的通知。


NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(id);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值