Widget 窗体小部件

应用:如桌面天气、桌面时钟、桌面音乐等等。被很多应用所采用。方便用户操作,更好的得到消息。如下图

 

android 开发 自定义小部件 安卓小部件制作_androidWidget

实现:

你需要知道一下两个对象:

AppWidgetProviderInfo对象

描述了一个小部件的元数据,如小部件的布局,更新频率,和AppWidgetProvider类。这需要在XML中自定义。

AppWidgetProvider类的实现

自定义基本方法,允许你实现App Widget接口。基于广播事件。通过此方法,当Widget更新、启动、禁用和删除时,将接收到广播。

 

对于Widget小部件的界面通过自定义XML文件进行实现。

实现步骤:

一、在App的AndroidManifest.xml对AppWidgetProvider类的声明

例如:

<receiver android:name="ExampleAppWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

The <receiver> element requires the android:name attribute, which specifies the AppWidgetProvider used by the App Widget.

The <intentfilter> element must include an <action> element with the android:name attribute. This attribute specifies that the AppWidgetProvider accepts the ACTION_APPWIDGET_UPDATE broadcast. This is the only broadcast that you must explicitly declare. The AppWidgetManager automatically sends all other App Widget broadcasts to the AppWidgetProvider as necessary.

The <meta-data> element specifies the AppWidgetProviderInfo resource and requires the following attributes:

android:name

android:resource -指定AppWidgetProviderInfo的布局文件.xml

二、该AppWidgetProviderInfo定义了小部件的基本信息,如其最小尺寸布局,其初始布局资源时,小部件的更新频率,和(可选)创建时配置活动正在展开。AppWidgetProviderInfo对象定义在XML资源使用单个元素并将其保存在xml项目的res/xml/文件夹下。

例如:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen">
</appwidget-provider>

 

三、对widget布局文件xml的自定义,这里就不在阐述。

四、AppWidgetProvider类的实现,通过继承AppWidgetProvider进行实现,

例如:

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;
        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];
            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);
            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

注意点:由于AppWidgetProvider是一个以广播的形式进行的,您的线程不能保证在该回调方法返回后,继续运行(见广播支持有关广播的信息生命周期)。

如果您的应用程序构件安装过程可能需要几秒钟(也许在执行web请求),并且需要您的流程仍在继续,考虑启动一个Service在onUpdate()方法中进行。从服务中,您可以执行您自己的小部件的更新,不用担心AppWidgetProvider关闭由于应用程序没有响应(ANR)错误。

五、接收Widget的广播

可以通过实现自己的BroadcastReceiver或者重写onReceiver(Context,Intent)返回,对于意图你需要关心如下:

· ACTION_APPWIDGET_UPDATE

· ACTION_APPWIDGET_DELETED

· ACTION_APPWIDGET_ENABLED

· ACTION_APPWIDGET_DISABLED

· ACTION_APPWIDGET_OPTIONS_CHANGED

具体实现可以参考以下widgetDemo示例:

 点击打开链接

更多帮助可以参照google官方文档。