android示例之AppWidget(3)

来源:互联网 发布:jquery数组增加元素 编辑:程序博客网 时间:2024/05/22 11:43

今天要完成的是接收来自AppWidget的广播和更新AppWidget控件的状态。

接收来自AppWidget的广播的步骤:

1、在Manifest当中为AppWidget注册新的intent-filter:要想接收Intent必须要有intent-filter,intent-filter决定了可以接收哪些intent。从本质上来讲AppWidgetProvider就是一个Broadcast;

2、使用getBroadcast方法创建一个PendingIntent;

3、为AppWidget中的控件注册处理器;

4、在onReceive方法中接收广播消息;

完成接收来自AppWidget功能和上一次通过接收来自AppWidget调用一个新的Activity是类似的。

布局文件不再贴出。

Manifest文件:

<receiver android:name="ExampleAppWidgetProvider">            <intent-filter >                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>            </intent-filter>            <intent-filter >                <action android:name="com.lyc.appwidget02.update_appwidget"/>            </intent-filter>            <meta-data android:name="android.appwidget.provider"                android:resource="@xml/example_appwidget_info"/>        </receiver>

ExampleAppWidgetProvider.java

public class ExampleAppWidgetProvider extends AppWidgetProvider {//定义自己的Actionprivate static final String UPDATE_ACTION="com.lyc.appwidget02.update_appwidget";@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);}@Overridepublic void onEnabled(Context context) {super.onEnabled(context);}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);String action=intent.getAction();if(UPDATE_ACTION.equals(action)){System.out.println("onReceive--->"+action);}}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {//创建一个intent,并设置其actionIntent intent=new Intent();intent.setAction(UPDATE_ACTION);//使用getBroadcast创建一个PendingIntent,并发送广播intentPendingIntent pendingIntent=PendingIntent.getBroadcast(context, 0, intent, 0);RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.example_appwidget);//设置监听remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);}}

调用onUpdate发出的广播由onReceive接收。

下面介绍AppWidget和控件的交互。

通过上面的例子可以发现,如果想要达到点击AppWidget的按钮,然后改变AppWidget的控件或内容,可以在onUpdate方法中设置按钮的监听事件:

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.button, pendingIntent);appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);

然后再onReceive方法中接收Intent,进行控件的交互。

如何接收Intent,然后进行控件的交互呢?

//得到AppWidget的所有控件RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.example_appwidget);//设置控件的交互效果remoteViews.setTextViewText(R.id.appwidget, "美女变小猫");//得到AppWidgetManagerAppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);//得到代表整个AppWidget的ComponentComponentName componentName=new ComponentName(context,ExampleAppWidgetProvider.class);//设置更新控件的方法appWidgetManager.updateAppWidget(componentName, remoteViews);

程序实现的效果是:

加载AppWidget,点击按钮前:


点击按钮后:


0 0
原创粉丝点击