本文共 3914 字,大约阅读时间需要 13 分钟。
一个桌面插件
从一个小Demo来做起:
1、在AndroidManifest中声明 App Widget 2、在xml目录定义 App Widget的初始化xml文件 3、实现Widget具体布局的Layout xml 4、继承APPWidgetProvider类,实现具体的Widget业务逻辑。实现步骤:
1、新建一个类TestWidet继承AppWidgetProvider; 再在AndroidManifest里注册intent-filter中过滤了APPWIDGET_UPDATE事件,这个事件是由系统触发的更新事件,每个widget必须包含这个事件;meta-data标签描述的是widget的配置文件指向,该文件描述了widget的一些基本信息。
2、定义resource(定义配置文件)
在这里定义 layout、最小宽高度、在Widget里的背景、更新时间等。
3、layout_widget布局文件
4、具体的Widget业务逻辑(onReceive方法和onUpdate方法)
package com.example.chenjinhua.myapplication;import android.app.PendingIntent;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.graphics.Color;import android.text.TextUtils;import android.util.Log;import android.widget.RemoteViews;/** * Created by chenjinhua on 16/3/26. */public class TestWidget extends AppWidgetProvider { public static final String WIDGET_BUTTON_ACTION = "widget_button_action"; @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if ( intent != null && TextUtils.equals(intent.getAction(),WIDGET_BUTTON_ACTION)){ Log.i("WIDGET_BUTTON_ACTION", "be clicked"); /* * 设置组件的变化 * */ //必须重新new一遍RemoteViews,不然RemoteViews不会更新的。 RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.layout_widget); remoteViews.setTextViewText(R.id.widget_textView,"be clicked"); remoteViews.setTextColor(R.id.widget_textView, Color.BLUE); /* * 更新组件 * */ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); //获取组件的名字 ComponentName componentName = new ComponentName(context,TestWidget.class); appWidgetManager.updateAppWidget(componentName,remoteViews); } } /* 当程序初始化时会调用onUpdate方法 * */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); //远程视图,把布局文件读出来,读成一个remoteViews的界面 /* * 1、在RemoteViews的构造函数中,通过传入layout文件的id来获取 “layout文件对应的视图(RemoteViews)"; * 2、然后,调用RemoteViews中的方法能对layout中的组件进行设置; * 3、可以调用setOnClickPendingIntent() 来设置Button的点击响应事件 * */ RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.layout_widget); Intent intent = new Intent(); //广播发给TestWidget.class本身,它本身可在onReceive方法里接收。 intent.setClass(context,TestWidget.class); intent.setAction(WIDGET_BUTTON_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0); remoteViews.setOnClickPendingIntent(R.id.widget_button,pendingIntent); //更新视图,告诉它我们做了这件事情 appWidgetManager.updateAppWidget(appWidgetIds,remoteViews); }}
Tips
顾名思义,它是一个远程视图。App Widget中的视图,都是通过RemoteViews表现的。 在RemoteViews的构造函数中,通过传入layout文件的id来获取 “layout文件对应的视图(RemoteViews)”;然后,调用RemoteViews中的方法能对layout中的组件进行设置(例如,可以调用setTextViewText()来设置TextView组件的文本,可以调用setOnClickPendingIntent() 来设置Button的点击响应事件)。因此,我们可以将 “RemoteViews 看作是 layout文件中所包含的全部视图的集合”。
(1)、如果是在onUpdate()方法内更新AppWidget界面
eg: appWidgetManager.updateAppWidget(appWidgetIds, ActivityView); (2)、如果是在onUpdate()方法外(一般为Service内)更新AppWidget界面,则需要定义几个变量 eg: public RemoteViews views; //RemoteView对象 public ComponentName thisWidget; //组件名 public AppWidgetManager manager; // AppWidget管理器thisWidget = new ComponentName(this, PictureAppWidgetProvider.class); manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(thisWidget, views);
1、与service通信
2、Widget控件的交互方法 3、如何做一个桌面播放器Widget转载地址:http://weani.baihongyu.com/