当前位置: 代码迷 >> 综合 >> 三、RemoteViews
  详细解决方案

三、RemoteViews

热度:43   发布时间:2023-12-15 20:16:16.0

RemoteViews

RemoteViews在Android中的应用场景有两种:通知栏和桌面小部件。

1.RemoteViews的应用

RemoteViews在实际的开发过程中,主要用在通知栏和桌面小部件的开发中。
通知栏主要是通过NotificationManager的notify方法来实现的,它除了默认效果,还可以自定义布局。
桌面小部件则是通过AppWidgetProvider来实现的,它本质上是一个广播。

通知栏和桌面小部件的开发过程都会用到RemoteViews,它们在更新界面的时候无法像Activity里面那样去直接更新View,这是因为二者的界面都是运行在其他的进程中,确切来说是系统的SystemServer进程。

为了跨进程更新界面,RemoteViews提供了一系列的set方法,并且这些方法只是Views全部方法的子集,另外,RemoteViews中所支持的View类型也是有限制的。

(1)RemoteViews在通知栏的应用
1)系统默认样式的通知

                   sId++;Notification notification = new Notification();notification. icon = R.drawable. ic_launcher;notification. tickerText = "hello world";notification. when = System. currentTimeMillis();notification. flags = Notification. FLAG_AUTO_CANCEL;Intent intent = new Intent( this, DemoActivity_2.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT );notification. setLatestEventInfo(this, "chapter_5","this is notification.", pendingIntent );NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE );manager.notify( sId, notification);

2)自定义样式的通知

                   sId++;Notification notification = new Notification();notification. icon = R.drawable. ic_launcher;//在状态栏提示的图标notification. tickerText = "hello world";//在状态栏提示的文字notification. when = System. currentTimeMillis();notification. flags = Notification. FLAG_AUTO_CANCEL;Intent intent = new Intent( this, DemoActivity_1.class);intent.putExtra( "sid", "" + sId);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT );System. out.println( pendingIntent);RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout. layout_notification );remoteViews.setTextViewText(R.id. msg, "chapter_5: " + sId);remoteViews.setImageViewResource(R.id. icon, R.drawable.icon1);PendingIntent openActivity2PendingIntent = PendingIntent. getActivity(this, 0,new Intent( this, DemoActivity_2.class),PendingIntent. FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id. open_activity2,openActivity2PendingIntent);notification. contentView = remoteViews;notification. contentIntent = pendingIntent;NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE );manager.notify( sId, notification);

更新RemoteViews必须通过RemoteViews所提供的一系列方法来更新view。

(2)RemoteViews在桌面小部件的应用
1)定义小部件
在res/layout下面新建一个XML文件,命名为widget.xml,名称和内容可以
自定义,看这个小部件要做成什么样子。

<?xml version="1.0" encoding= "utf-8"?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"android:layout_width= "match_parent"android:layout_height= "match_parent"android:orientation="vertical" ><ImageView  android:id= "@+id/imageView1"android:layout_width= "wrap_content"android:layout_height= "wrap_content"android:src= "@drawable/icon1" />
</LinearLayout>

2)定义小部件配置信息
在res/xml下新建appwidget_provider_info.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>

上面的参数的意思:
initialLayout是小工具初始化的布局;
minHeight和minWidth定义小工具的最小尺寸;
updatePeriodMillis定义小工具的自动更新的周期,毫秒为单位。

3)定义小部件的实现类

4)Manifest声明

        <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.ryg.chapter_5.action.CLICK" /><action android:name= "android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter ></receiver >

两个action,第一个用于标识识别小部件的单机行为,第二个则作为小部件的标识,必须存在。

未完。。。

这篇估计不会写了

:cry: