App Widget(Application Widget)的实现步骤:
a、创建AppWidgetProvider对象,通过使用XML(appwidgetinfo.xml)来定义:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/awl" > </appwidget-provider>
定义了AppWidget的最小宽度、最小高度、更新周期和AppWidget的初始布局。
其中AppWidget的初始布局文件(awl.xml)为如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="test"/> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="click"/> </LinearLayout>
b、实现AppWidgetProvider类(AWTProvider.java):
package yc.yc; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class AWTProvider extends AppWidgetProvider { //每当一个AppWidget被删除,就会调用onDeleted方法。 @Override public void onDeleted(Context context, int[] appWidgetIds) { System.out.println("delete"); super.onDeleted(context, appWidgetIds); } //当最后一个AppWidget被删除,就会调用onDisabled方法。 //在此方法中一般情况下执行一些AppWidget的结束性操作,如删除一个临时数据库等操作。 @Override public void onDisabled(Context context) { System.out.println("disable"); super.onDisabled(context); } //当第一个AppWidget实例被创建是,就会调用onEnabled方法。 //在此方法中一般情况下执行一些AppWidget的初始化的工作,如新建一个数据库或者一些操作等。 @Override public void onEnabled(Context context) { System.out.println("enable"); super.onEnabled(context); } //onReceive相当一个经理,当外界来任务了,将任务分发给其下的员工(onEnable,onDeleted,onDisabled,onUpdate)处理 @Override public void onReceive(Context context, Intent intent) { System.out.println("receive"); super.onReceive(context, intent); } //在这里onUpdate执行的条件有两个:1、到了我们所设定的更新周期了;2、添加一个新的AppWidget。 //在onUpdate中一般为控件定义事件处理或者开启一个临时的Service。 //这里是为我们的button控件添加点击事件处理 //context表示这个接收器正在运行的环境 //appWManager表示AppWidget的管理器可通过调用 updateAppWidget(ComponentName, RemoteViews)更改指定AppWidget的控件属性 //appWidgetIds表示Appwidget的编号,系统自动生成 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { System.out.println("update"); final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int appWidgetId = appWidgetIds[i]; System.out.println("appWidgetId="+appWidgetId); Intent intent = new Intent(context, AWTActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.awl); views.setOnClickPendingIntent(R.id.btn, pendingIntent); appWidgetManager.updateAppWidget(appWidgetId, views); } } }
C、在AndroidManifest.xml中注册实现类,并且定义元数据:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="yc.yc" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".AWTActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 注册实现类 --> <receiver android:name=".AWTProvider"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <!-- 定义元数据 --> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidgetinfo"/> </receiver> </application> </manifest>
注意:这只是AppWidget的第一讲,还有后续的课程。