在开发AppWidget时,我们都需要写一个自己的类去继承AppWidgetProvider,本文简单地对AppWidgetProvider的源码进行分析。
首先,AppWidgetProvider继承了BroadcastReceiver,所以本质上它是一个广播接收器,特别地它主要接收由AppWidgetService发送的关于AppWidget的一些广播而已。
其次,它只有一个空的构造方法,并且没有任何成员变量,只有五个方法,当然,其中一个就是onReceive方法,这是它作为广播接收器必须实现的方法。另外四个方法分别是onUpdate、onDeleted、onEnabled和onDisabled,但是这四个方法体都是空的,用户继承了AppWidgetProvider可以自己实现这些方法作想做的事。
关键我们来看onReceive方法。首先附上源码,再对其进行分析。
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
Bundle extras = intent.getExtras();
if (extras != null) {
int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds != null && appWidgetIds.length > 0) {
this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
}
}
}
else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
Bundle extras = intent.getExtras();
if (extras != null && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
this.onDeleted(context, new int[] { appWidgetId });
}
}
else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
this.onEnabled(context);
}
else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
this.onDisabled(context);
}
}
代码其实非常简单,对接收到的Intent提取出它携带的Action,然后根据Action的不同,分别调用自己的四个方法。四个Action在AppWidgetManager中定义如下:
public static final String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
public static final String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED";
public static final String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED";
public static final String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
这里需要注意的是,一般我们在自己写AppWidget继承AppWidgetProvider时,应该要override onUpdate这个方法,好像如果不的话,你的AppWidget就不会生效,具体我也没有搞清楚。虽然我们自己继承AppWidgetProvider的类本质上是一个广播接收器,但是我们可以不override onReceive这个方法,只要调用父类的这个方法就可以,当然如果你想接收一些其他的广播,当然就要复写这个方法,加上自己的判断。
还有一些问题需要说明一下:1.谁会发送广播给AppWidgetProvider;2.什么时候发送广播;3.为何我们在Manifest.xml中只注册了一个Action: android.appwidget.action.APPWIDGET_UPDATE,却可以接收四种广播。下面是Manifest.xml的一部分,可以看到在 intent-filter 中只有一个Action:
<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>
对于第一个问题,是AppWidgetService在发送广播,AppWidgetService负责管理所有的AppWidget,并且它与AppWidgetProvider的交互方式就是通过发送广播的机制。至于何时发送广播,一般地当某个AppWidget第一次被手机用户创建时,会发送一条Enabled和Update广播,之后如果用户再创建这个AppWidget时,则只会发送一条Update广播,当手机用户删除一个AppWidget时,自然会收到一条DELETED广播,如果这个AppWidget在手机中没有了,则会再发送一条DISABLED广播,还有就是每个AppWidget有自己的更新时间,一般要半个小时以上才能更新一次,等更新时间到了,还会发送一条Update广播,但是据说目前Android 4.0 已经没有这个功能了,不知道详情。如果想了解更多的关于广播发送的内容,最好还是去看AppWidgetService。