和App Widget相关的基本概念
1、 AppWidgetProviderInfo对象:为App Widget提供元数据,包括布局,更新频率等数据。这个对象被定义在XML文件当中
2、 AppWidgetProvider:定义了App Widget的基本生命周期函数。
创建第一个AppWidget的步骤:
1、定义AppWidgetProviderInfo:
在res/xml文件夹当中定义一个名为example_appwidget_info.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"
>
</appwidget-provider>
2、为App Widget指定样式和布局:
定义一个新的布局文件example_appwidget.xml
3、实现AppWidgetProvider
a) onUpdate:在到达指定的更新时间之后或者当用户向桌面添加AppWidget时会调用该方法。
b) onDeleted:当App Widget被删除时
c) onEnabled:第一个App Widget的实例第一次被创建时
d) onDisabled:当最后一个App Widget实例被删除后
e) onReveice:接收广播事件
PendingIntent “锦囊”
创建PendingIntent的方法:
1、getActivity(Contextcontext, int requestCode, Intent intent, int flags)为了启动Activity
2、getBroadcast(Contextcontext, int requestCode, Intent intent, int flags)为了发送广播
3、getService(Contextcontext, int requestCode, Intent intent, int flags)为了启动服务
RemoteViews的作用:
1、RemoteViews对象表示了一系列的View对象
2、RemoteViews所表示的对象运行在另外的进程当中
通过RemoteViews来对App Widget进行操作,包括绑定处理器、更新控件等
App Widget的响应
1、向App Widget中添加Button
example_appwidget.xml
……..
<Button android:id="@+id/widgetButtonId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试用按钮"
/>
2、为Button绑定处理器
由于App Widget和我们的应用程序运行在不同的进程当中(App Widget当中的View运行在Home Screen进程当中),所以无法按照之前惯用的方法绑定监听器
public void onUpdate(Context context, AppWidgetManagerappWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generatedmethod stub
for(int i = 0; i< appWidgetIds.length; i ++){
System.out.println(appWidgetIds[i]);
//创建一个Intent对象
Intent intent = new Intent(context, TargetActivity.class);
//创建一个PendingIntent
PendingIntent pendingIntent = PendingIntent.getActivity(context,0, intent, 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
//为按钮绑定事件处理器
//第一个参数用来指定被绑定处理器的控件的ID
//第二个参数用来指定当事件发生时,哪个PendingIntent将会被执行
remoteViews.setOnClickPendingIntent(R.id.widgetButtonId, pendingIntent); //点击按钮时,调用pendingIntent,即启动TargetActivity
//更新AppWidget
//第一个参数用于指定被更新AppWidget的ID
appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
接收来自AppWidget的广播
1、在AndroidManifest.xml当中为AppWidgetProvider注册新的intent-filter
2、使用getBroadcast()方法创建一个PendingIntent
3、为AppWidget当中的控件注册处理器
4、在onReceive方法当中接收广播消息
AppWidgetProvider的运行机制
当用来更新控件时,使用getBroadcast发送广播,当点击按钮时开始发送
Intent intent = new Intent();
intent.setAction(UPDATE_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
remoteViews.setOnClickPendingIntent(R.id.widgetButtonId, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
在onReceive方法中进行更新
public void onReceive(Context context, Intent intent) {
// TODO Auto-generatedmethod stub
String action = intent.getAction();
if(UPDATE_ACTION.equals(action)){
System.out.println("onReceive-->" + UPDATE_ACTION);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);
remoteViews.setTextViewText(R.id.widgetButtonId, "textChange");
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName componentName = new ComponentName(context,ExampleAppWidgetProvider.class);
appWidgetManager.updateAppWidget(componentName, remoteViews);
}else
{
super.onReceive(context, intent); //其他广播的接收响应,如onDeleted、onEnabled等
}
}