AppWidget之AppWidgetProvider

来源:互联网 发布:java正则表达式空格 编辑:程序博客网 时间:2024/05/16 01:45

    在开发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。