RemoteViews在其它进程中显示,提供了一组基础操作用于跨进程更新界面。
一、通知栏(Notification)
通知栏涉及到两个类,一个是Notification通知信息类,对应了通知栏的各个属性;一个是NotificationManager通知管理类,负责发通知、清除通知等操作。
Notification的常用属性:
- icon:通知上的图标
- tickerText:通知显示的滚动文字
- when:通知的时间
- flags:通知的特性,主要是一些取消的特性
- contentView:通知的视图
- defaults:默认效果,通知提示的效果
- contentIntent:点击通知栏的效果
- sound:通知的声音

NotificationManager是一个系统的服务,必须通过getSystemService(NOTIFICATION_SERVICE);来获取
1)获取状态通知栏管理:

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

2)实例化通知栏构造器NotificationCompat.Builder:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

3)对Builder进行配置

builder.setContentTitle("通知标题")
                .setContentText("通知内容")
                .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知栏显示
                .setSmallIcon(R.mipmap.ic_launcher)
//                .setContentIntent(PendingIntent.getActivity(this,1,new Intent(),Notification.FLAG_AUTO_CANCEL))//设置通知栏点击意图
//                .setNumber(number)设置通知集合数量
                .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知的优先级
                .setTicker("通知来了")//通知首次出现在通知栏,带动画上升效果
                .setAutoCancel(true)//设置这个标志让用户单击面板就可以让通知自动取消
                .setOngoing(false)//设置为true表示为一个正在进行的通知,通常用来表示一个后台任务
                .setDefaults(Notification.DEFAULT_VIBRATE);//向通知添加声音、闪光和振动效果

1.设置提醒标志符Flags
提醒标识符,向通知添加声音、闪灯和振动效果等设置达到通知提醒效果,可以组合多个属性
- Notification.FLAG_SHOW_LIGHTS //三色灯提醒,在使用三色灯提醒时候必须加该标志符
- Notification.FLAG_ONGOING_EVENT //发起正在运行事件(活动中)
- Notification.FLAG_INSISTENT //让声音、振动无限循环,直到用户响应 (取消或者打开)
- Notification.FLAG_ONLY_ALERT_ONCE //发起Notification后,铃声和震动均只执行一次
- Notification.FLAG_AUTO_CANCEL //用户单击通知后自动消失
- Notification.FLAG_NO_CLEAR //只有全部清除时,Notification才会清除
- Notification.FLAG_FOREGROUND_SERVICE //表示正在运行的服务
设置方式:

Notification notification = mBuilder.build();  
notification.flags = Notification.FLAG_AUTO_CANCEL;

2..setDefaults(int defaults)
向通知添加声音、闪灯和振动效果的最简单、使用默认(defaults)属性,可以组合多个属性
- Notification.DEFAULT_VIBRATE //添加默认震动提醒 需要 VIBRATE permission
- Notification.DEFAULT_SOUND // 添加默认声音提醒
- Notification.DEFAULT_LIGHTS// 添加默认三色灯提醒
- Notification.DEFAULT_ALL// 添加默认以上3种全部提醒
3.setVibrate(long[] pattern)
设置震动方式。
4..setLights(intledARGB ,intledOnMS ,intledOffMS )
设置不同场景下的不同颜色的灯。
5.setSound(Uri sound)
设置默认或则自定义的铃声,来提醒。
6.setPriority(int pri)
对应属性Notification.PRIORITY_DEFAULT、Notification.PRIORITY_HIGH、Notification.PRIORITY_LOW、Notification.PRIORITY_MAX、Notification.PRIORITY_MIN
4)设置通知栏PendingIntent
通过setContentIntent(PendingIntent intent)方法设置在通知窗口区域Notification被单击时的响应事件;
setDeleteIntent:当用户点击全部清除按钮时,响应该清除事件的Intent;
setFullScreenIntent:响应紧急状态的全屏事件(例如来电事件),也就是说通知来的时候,跳过在通知区域点击通知这一步,直接执行fullScreenIntent代表的事件。
5)发送通知请求

Notification notification = builder.build();
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        manager.notify(1,notification);

自定义通知栏
Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。否则会引起ClassNotFoundException异常
1)创建自定义视图
2)获取远程视图对象(注:Notification的contentView不能为空)
3)设置PendingIntent(来响应各种事件)
4)发起Notification

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.custom_notification);
        remoteViews.setTextViewText(R.id.text_name,"孙燕姿");
        remoteViews.setTextViewText(R.id.text_singer,"我不难过");
        remoteViews.setOnClickPendingIntent(R.id.btn_start,PendingIntent.getBroadcast(this,1,new Intent(),0));
        remoteViews.setOnClickPendingIntent(R.id.btn_stop,PendingIntent.getBroadcast(this,1,new Intent(),0));

        builder.setContent(remoteViews)
                .setWhen(System.currentTimeMillis())
                .setTicker("正在播放")
                .setOngoing(true)
                .setPriority(Notification.PRIORITY_DEFAULT)
                .setSmallIcon(android.R.drawable.ic_lock_power_off);
        Notification notification = builder.build();
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.notify(1,notification);

消除通知:
mNotificationMgr.cancle(NOTIFICATION_ID);//消除对应ID的通知
mNotificationMgr.cancleAll();//消除创建的所有通知
二、桌面小部件
1)定义小部件界面
在res/xml目录下
2)定义小部件配置信息
在res/xml目录下

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget"
    android:minHeight="84dp"
    android:minWidth="84dp"
    android:updatePeriodMillis="86400000">

</appwidget-provider>

3)定义小部件实现类
继承AppWidgetProvider
- onReceive:这是广播的内置方法,用于分发具体事件给其它方法
- onUpdate:小部件被添加时或者每次小部件更新时都会调用一次该方法,小部件的更新时机由uodatePeriodMills来指定,每个周期小部件都会自动更新一次
- onEnable:当该窗口小部件第一次添加到桌面时调用该方法,可添加多次但只在第一次调用
- onDeleted:每删除一次桌面小部件就调用一次
- onDisabled:当最后一个该类型的桌面小部件被删除时调用该方法

4)在AndroidManifest.xml中声明小部件
桌面小部件本质上是一个广播组件,mata-data标签的android:resource属性指定小部件的配置文件,必须要有一个action是android.appwidget.action.APPWIDGET_UPDATE

<receiver android:name=".MyAppWidgetProvider">
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/appwidget_provider_info">
            </meta-data>
            <intent-filter>
                <action android:name="com.it.zjhz.appwidgetdemo.CLICK"/>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
        </receiver>

三、PendingIntent
PendingIntent是在将来某个不确定的时刻发生,Intent是立刻发生。
- getActivity:启动Activity
- getService:启动服务
- getBroadcast:发送广播
flags:
- FLAG_ONE_SHOT:当前描述的PendingIntent只能被使用一次,然后它就会被自动cancel;
- FLAG_NO_CREATE:当前描述的PendingIntent不会主动创建;
- FLag_CANCEL_CURRENT:当前描述的PendingIntent如果已经存在,那么它们都会被cancel,然后系统会创建一个新的PendingIntent;
-FLAG_UPDATE_CURRENT: 当前描述的PendingIntent如果已经存在,那么它们都会被更新,即Intent中的Extras会被替换成最新的;