RemoteViews——简单应用
一、在通知栏中使用
用于在通知中使用自定义布局,使用方法较简单,利用RemoteViews对象加载自定义布局,再调用notification的setContent方法设置RemoteViews即可。
由于RemoteView不可直接获得控件实例,所以通过特定的方法设置控件参数。代码如下
RemoteViews remoteView = new RemoteViews(getPackageName(),R.layout.notification_layout); PendingIntent pi2 = PendingIntent.getActivity(this,0,new Intent(this,Main2Activity.class),PendingIntent.FLAG_UPDATE_CURRENT);remoteView.setTextViewText(R.id.msg,"something"); //利用PendingIntent为控件设置监听 remoteView.setOnClickPendingIntent(R.id.msg,pi2); remoteView.setTextColor(R.id.msg, Color.BLACK);
二,在桌面控件AppWidgetProvider中的应用
AppWidgetProvider是用于实现桌面小插件的类,其本质为广播接收器,即BroadcastReceiver,在应用中与之有诸多类似。
分为以下四步:
1,定义小部件的界面
在layout文件夹下,编写小部件的自定义界面
2、定义小部件配置信息
在对AppWidgetProvider进行声明时,用于对小部件进行初始化配置
主要配置布局文件、最小宽高、自动更新时间等
<?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方法,用于接受广播,判断Action进而处理事件,如单击事件等。
复写onUpdate方法,每次更新时的回调方法,第一次添加控件时也会调用,故也可用于初始化。
onRevice方法的具体实现,在这里判断单击事件并旋转图片
@Override public void onReceive(final Context context, Intent intent) { super.onReceive(context, intent); //判断Action并采取对应操作 //在此处是对单击事件进行处理(CLICK_ACTION为自定义ACTION),令图片旋转一周 if (intent.getAction().equals(CLICK_ACTION)){ Toast.makeText(context,"You clicked it ",Toast.LENGTH_SHORT).show(); //耗时任务开启子线程处理,避免阻塞 new Thread(new Runnable() { @Override public void run() { Bitmap srcBitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.icon2); AppWidgetManager manager = AppWidgetManager.getInstance(context); for (int i = 0; i < 37;i++){ float degree = (i*10)%360; //重新构造RemoteViews,加载旋转后的图片 RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget); remoteViews.setImageViewBitmap(R.id.image_view,rotateBitmap(context,srcBitmap,degree)); //重新设置监听 Intent onClickIntent = new Intent(); onClickIntent.setAction(CLICK_ACTION); PendingIntent pi = PendingIntent.getBroadcast(context,0,onClickIntent,0); remoteViews.setOnClickPendingIntent(R.id.image_view,pi); //更新AppWidgetProvider manager.updateAppWidget(new ComponentName(context,MyAppWidgetProvider.class),remoteViews); SystemClock.sleep(30); } } }).start(); } }
//旋转图片具体实现 private Bitmap rotateBitmap(Context context, Bitmap srcBitmap, float degree) { //利用matrix生成新的Bitmap对象并返回 Matrix matrix = new Matrix(); matrix.reset(); matrix.setRotate(degree); Bitmap tmpBitmap = Bitmap.createBitmap(srcBitmap,0,0,srcBitmap.getWidth(),srcBitmap.getHeight(),matrix,true); return tmpBitmap; }
onUpdate的实现,这里只做简单初始化处理,没有执行额外的操作
@Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); //遍历AppWidgetProvider final int counter = appWidgetIds.length; for (int i = 0 ;i < counter;i++){ int appWidgetId = appWidgetIds[i]; updateWidget(context,appWidgetManager,appWidgetId); } } private void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { //构造RemoteViews,设置单击监听,发送CLICK_ACTION,更新AppWidgetProvider RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget); Intent intent = new Intent(); intent.setAction(CLICK_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0); remoteViews.setOnClickPendingIntent(R.id.image_view,pendingIntent); appWidgetManager.updateAppWidget(appWidgetId,remoteViews); }
4、在AndroidManifest.xml文件中声明小部件
由于其本质为BroadcastReceiver,因此需要在注册文件中注册。
注册格式也大致相同,这里meta-data的name属性与第二个Action为固定格式,不可遗漏或更改,否则将无法在小部件列表中找到自定义部件。
在meta-data条目下需配置前面编写的配置文件。
注册代码如下
<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.example.remoteviewtest.action.CLICK" /> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> </receiver>
至此小部件已完成。在AppWidget中还存在多个常用的方法,当广播到来之后,AppWidgetProvider会根据广播的Action通过onReceive方法自动分发广播,即调用下述方法:
onEnable:当小部件第一次添加时调用。
onUpdate:每次添加或者更新时调用,更新为固定周期(updatePeriodMillis)
onDeleted:没删除一次就调用一次
onDisabled:当最后一个小部件被移除时调用
onReceive:内置方法,用于具体分发事件给其他方法
桌面小部件的各种操作都依赖于RemoteView。
浙公网安备 33010602011771号