app widget简单用法(1)

xiaoxiao2021-02-27  465

本文章是对我学习 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 。

转载请注明原文地址: https://www.6miu.com/read-671.html

最新回复(0)