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。
- AppWidget之AppWidgetProvider
- adnroid.appwidget.AppWidgetProvider
- adnroid.appwidget.AppWidgetProvider
- adnroid.appwidget.AppWidgetProvider
- adnroid.appwidget.AppWidgetProvider
- Android AppWidget的分析与应用AppWidgetProvider
- Android基础之AppWidgetProvider
- Android之AppWidgetProvider
- Android基础之AppWidgetProvider
- Android基础之AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- (转)Android中AppWidget的分析与应用:AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- Android中AppWidget的分析与应用:AppWidgetProvider
- 华为编程规范
- jdbc与hibernate的优缺点比较(转)
- POJ 1860
- 服务器上没有安装VS环境时,怎么用vs的命令提示工具,解决方案
- hdu 1305
- AppWidget之AppWidgetProvider
- shell中如何判断一个变量是否为空
- 上网本 硬盘安装linux 最揪心的回忆
- 别了,ACM
- centos6.3安装bluefish
- Redhat Add and Remove Software[No Groups Available in any repository ]
- bluefish中文乱码问题
- 关于Java中的 ==, equals(), hashCode()的作用
- GIS开源程序收集