关于AppWidget的深入理解1

App Widgets是小型views,可以嵌入到其他应用程序并且接收定期更新。这些views被称为Widgets组件,您可以通过App Widget provider去发布Widgets,能够容纳其他App Widgets称为App Widget host。

创建一个Widget ,你需要:
AppWidgetProviderInfo object

描述一个App Widget,如App Widget的布局,更新频率,以及AppWidgetProvider类的metadata。这在XML中定义。
AppWidgetProvider class implementation

在代码层次实现能与基于广播机制事件的App Widget进行交互的基本方法。通过它,当App Widget更新,启用,禁用和删除的时候就能收到广播。
View layout

通过XML定义的App Widget初始化布局。
另外,可以实现一个配置App Widget的Activity 。 这个可选的Activity 是当用户添加App Widget的时候打开 ,允许用户在创建时候去对App Widget 配置。
下面介绍一下怎么去使用这些组件:

一、在AndroidManifest.xml中声明App Widget

<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>

<receiver>需要android:name属性,它指定App Widget所使用的AppWidgetProvider。
<intent-filter>需要含android:name 属性的<action>,这个属性指定AppWidgetProvider接收ACTION_APPWIDGET_UPDATE广播,这是唯一一个需要明确声明的广播。当需要时,AppWidgetManager自动给所有App Widget发送广播。
<meta-data>指定了AppWidgetProviderInfo资源,需要以下属性:
android:name – 指定metadata的名字。使用android.appwidget.provider将其作为AppWidgetProviderInfo的描述性数据。
android:resource - 指定AppWidgetProviderInfo资源的位置。
二、增加AppWidgetProviderInfo Metadata
一个App Widget的基本属性是通过AppWidgetProviderInfo去定义的,例如它的最小尺寸的布局,它的初始layout,多久更新App Widget,还有(可选)在创建时期的一个配置Activity。在XML资源中定义一个AppWidgetProviderInfo是通过<appwidget-provider>标签,并保存在工程的res/xml/文件夹底下。例如

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"

android:minWidth="294dp"

android:minHeight="72dp"

android:updatePeriodMillis="86400000"

android:initialLayout="@layout/example_appwidget"

android:configure="com.example.android.ExampleAppWidgetConfigure" > </appwidget-provider>



updatePeriodMillis 属性定义了App Widget应该多久向AppWidgetProvider请求更新。实际更新的时间未必能保证及时更新,并且建议尽量不要频繁更新---比如一小时一次去更新电量。也可以容许用户去自定义更新的时间。
configure 属性是当用户添加一个App Widget前启动的Activity,这个Activity的作用就是配置App Widget的属性。(Optional)

三、为App Widget定义Layout

只要你熟悉用xml怎么去定义layout的话,为App Widget定义一个layout还是很简单的。但是由于App Widget的布局是基于RemoteViews,所以只能使用RemoteViews所支持的layout或者view。
RemoteViews支持的layout和view如下:
Layout – FrameLayout LinearLayout RelativeLayou

View -- AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView

注意:继承这些类的子类同样不支持。

四、使用AppWidgetProvider

AppWidgetProvider是BroadcastReceiver的子类,这个类处理App Widget广播。AppWidgetProvider只接收于App Widget有关系的广播,比如App Widget在updated, deleted, enabled, and disabled。当这些广播发生的时候,AppWidgetProvider会调用一下回调方法:
onUpdate(Context, AppWidgetManager, int[])

间隔调用此方法去更新App Widget,间隔时间的设置是在AppWidgetProviderInfo下的updatePeriodMillis属性,同样当用户添加App Widget的时候也被调用。如果你已经声明了一个configuration Activity,用户添加App Widget的时候就不会调用onUpdate,但是在随后的更新中依然会被调用。
onDeleted(Context, int[])

当App Widget 从App Widget host 中删除的时候调用。
onEnabled(Context)

当App Widget第一次创建的时候调用。比如,当用户增加两个同样的App Widget时候,这个方法只在第一次去调用。如果你需要打开一个新的数据库或者其他的设置,而这在所有的App Widgets只需要设置一次的情况下,这个是最好的地方去实现它们。
onDisabled(Context)

当App Widget的最后一个实例从App Widget host中被删除的时候调用。这里可以做一些在onEnabled(Context)中相反的操作,比如删除临时数据库。
onReceive(Context, Intent)

每一个广播的产生都会调用此方法,而且是在上面方法之前被调用。通常不需要实现此方法。
在AppWidgetProvider中最重要的callback就是onUpdated(),如果你的App Widget接收用户交互事件,就需要在这个callback里面进行处理。
如果你需要一个带有Button的App Widget,点击Button去启动一个Activity,下面就是AppWidgetProvider的实现方法:
public class ExampleAppWidgetProvider extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider

for (int i=0; i<N; i++) {

int appWidgetId = appWidgetIds[i];

// Create an Intent to launch ExampleActivity

Intent intent = new Intent(context, ExampleActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

// Get the layout for the App Widget and attach an on-click listener to the button

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);

views.setOnClickPendingIntent(R.id.button, pendingIntent);

// Tell the AppWidgetManager to perform an update on the current App Widget

appWidgetManager.updateAppWidget(appWidgetId, views);

}

}
}

五、创建App Widget Configuration Activity

这个Activity将通过App Widget自动启动,用户可以给App Widget设置有用的参数,比如App Widget的颜色、大小、更新时间或者其他的属性。
在AndroidManifes.xml中定义这个Activity和一般定义Activity基本没有区别,App Widget host启动这个Activity需要一个Action,所以:
<activity android:name=".ExampleAppWidgetConfigure">

<intent-filter>

<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />

</intent-filter>
</activity>

同样这个Activity必须在AppWidgetProviderInfo XML文件中定义android:configure。
值得注意的是App Widget host调用configuration Activity,configuration Activity必须要返回一个结果(必须包含App Widget ID)saved in the Intent extras as EXTRA_APPWIDGET_ID
六、通过configuration Activity去更新App Widget

1. 获取App Widget ID

Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}


2. 设置 App Widget 参数
3. 当设置完成,通过getInstance(Context)获取AppWidgetManager实例AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);
4. 通过调用updateAppWidget(int, RemoteViews)去更新App Widget

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);
appWidgetManager.updateAppWidget(mAppWidgetId, views);

5. 创建一个返回的Intent,结束Activity

Intent resultValue = new Intent();

resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);

setResult(RESULT_OK, resultValue);
finish();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值