本文章是对我学习 android 过程中学到的知识进行汇总、整理、与分享。内容来源为 网络流传的视频、文章、android官方文档等。在此感谢那些在我学习过程中提供知识和帮助的无私的人。
使用对象:AppWidgetProviderInfo 和 AppWidgetProvider 。
1. AppWidgetProviderInfo :为App Widget 提供元数据,包括布局,更新频率等信息。这个对象在XML中定义。
2.AppWidgetProvide :定义了App Widget 的生命周期函数。
创建步骤:
1. 定义AppWidgetProviderInfo :
(1)在res/xml 文件夹中定义一个名为 meta_data_appwidget_info.xml 的文件:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="100dip" android:minHeight="100dip" android:updatePeriodMillis="43200000" android:initialLayout="@layout/appwidget"> </appwidget-provider>这里的 android:initialLayout="@layout/appwidget" 是app widget 的布局文件。
(2)在res/Layout 中创建 appwidget.xml 文件(app widget的布局文件)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00ff00" android:text="@string/hello_world" /> </LinearLayout>这里只用一个TextView做个简单示范。
2. 实现AppWidgetProvider (重写几个回调函数,实现生命周期?)
onUpdate: 在达到指定的更新时间之后,或当用户向桌面添加app widget 时会调用该方法。
onDeleted: 当app widget 被删除时,会调用该方法。
onEnabled: 当app widget 的第一个实例被创建时,会调用该方法。(用户可以添加n多个实例,但只有在第一次添加时才会调用这个方法)
onDisabled: 当 最后一个 app' widget 实例被删除后,会调用该方法。
onReveice: 接受广播事件。(app widget的状态改变,其实是通过广播来实现的)
onAppWidgetOptionsChanged: 当app widget 改变的时候,会调用该方法?
创建类 MyAppWidgetProvider ,继承 AppWidgetProvider 并重写上面几个方法。
注意因为 MyAppWidgetProvider 需要随时被 activity thread 访问,所以必须写成 public 。而且必须静态注册 receiver 。
3. 在 androidMainFest.xml 里注册一个receiver
<receiver android:name="MyAppWidgetProvider"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/meta_data_appwidget_info"/>
</receiver>
这里的 android:name="MyAppWidgetProvider" 就是你继承 AppWidgetProvider 的那个子类的名字,注意名字前面没有” .“。
这里的 android:resource="@xml/meta_data_appwidget_info" 就是刚才在 xml 文件夹手动创建的 解析app widget 布局文件的文件。
这里的 action name 和 meta-data name 都是系统定义好,固定的。有时候代码填充不显示,需要自己手动敲上去。
至此,一个 add widget 就已经完成了。可以看到运行结果
我出现过的问题:
1. Unable to instantiate receiver ... (无法实例化接收器), class ... is not accessivle from class android.app.ActivityThread(不能从 android 系统的 Activity 线程 中访问)
问题原因:
public class *** extends AppWidgetProvider {} ,*** 必须写成 public 。而且必须静态注册 receiver 。