Android创建Widget总结(1)--创建普通Widget

AppWiidget就是桌面小部件,这里我们需要创建的是一个比较简单的AppWidget,仅实现了点击按钮后启动一个Intent的功能。


实现Widget必须要用到两个相关对象:

AppWidgetProviderInfo,这个对象描述了Widget的一些元数据,一般情况下我们使用xml文件定义。我们在/res下新建xml目录,并在/res/xml目录下新建一个xml文件描述该对象。

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
     android:minHeight="72dp"
 	android:minWidth="294dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/free_appwidget" > 
</appwidget-provider>

以上定义了一个layout文件,那么我们需要新创建一个:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <Button android:id="@+id/btn_faw_testbtn"
         android:text="@string/s_btn_faw_testbtn"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/> 
    <TextView android:id="@+id/tv_faw_testview"
        android:text="@string/test_text"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
        />     
    
    <Button android:id="@+id/btn_faw_broadcastbtn"
         android:text="@string/s_btn_faw_broadcastbtn"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/> 

</LinearLayout>

AppWidgetProvider,这个对象定义了实现AppWidget的接口。

package com.freesoft.frameworkdemo.appwidget;

import com.freesoft.frameworkdemo.R;
import com.freesoft.frameworkdemo.activity.ActivityDemoActivity;

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.util.Log;
import android.widget.RemoteViews;

public class FreeWidgetProvider extends AppWidgetProvider {
	private static final String TAG="FreeWidgetProvider";
	private static final String BROADCAST_STRING="com.freesoft.framework.appwidget.FreeWidgetProvider";

	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		Log.v(TAG, "onDeleted");
		super.onDeleted(context, appWidgetIds);
	}

	@Override
	public void onDisabled(Context context) {
		Log.v(TAG, "onDisabled");
		super.onDisabled(context);
	}

	@Override
	public void onEnabled(Context context) {
		Log.v(TAG, "onEnabled");
		super.onEnabled(context);
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		Log.v(TAG, "onUpdate");
		for (int i = 0; i < appWidgetIds.length; i++) {
			RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.free_appwidget);
			Intent intent = new Intent(context, ActivityDemoActivity.class);
			PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
			views.setOnClickPendingIntent(R.id.btn_faw_testbtn, pi);
			
			appWidgetManager.updateAppWidget(appWidgetIds[i], views);
		}
		
		
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}

}

其中以上部分本小节中仅关心onUpdate方法,这个方法在我们将AppWidget添加到桌面上时调用,我们需要在这里设置我们的界面显示和注册按钮事件。


由于AppWidgetProvider本质上是一个BroadcastReceiver(看源码里面的继承关系),那么我们在AndroidManifest.xml文件中必须添加内容:

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

至此,大功告成了!


总结一下:

  1. 需要配置AndroidManifest.xml文件,添加一个receiver的注册。
  2. AndroidManifest.xml文件中说明了需要使用/res/xml/xxx.xml文件来描述AppWidgetProviderInfo
  3. 描述AppWidgetProviderInfo的元数据xml文件描述了需要使用一个布局文件来描述AppWidget的布局。
  4. 继承AppWidgetProvider类的provider类必须实现onUpdate方法来实现界面刷新布局(其实就是通知appwidgetManager怎么刷新这个widget的UI)、注册事件。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值