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。

posted on 2017-03-28 21:13  AndroidLu  阅读(1246)  评论(0)    收藏  举报

导航