android学习笔记之AppWidget

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值