App Widget敷衍Android来说好坏常强大的。通过它,开辟职员可以创建大抵的控件,在主屏幕上或在恣意步调中提供雷同的主机托管结果。在创建一主屏幕App Widget时,您学习了怎样创建和配置一个App Widget。这个大抵的应用步调插件播放了一个由利用者预先设置时间隔绝的图像幻灯片。但是,要是利用者想变革这个时间隔绝?要是他们想停息幻灯片或立即跳到下一张图像他们该怎么做呢?在本文中,您将学习怎样对App Widget增长利用者控件来处理惩罚处罚这些活动。
为了处理惩罚处罚与App Widget的交互,必须实行下面的任务:
1、为每个App Widget控件设置唯一的单击处理惩罚处罚器。
2、这个单击处理惩罚处罚器向注册汲取器发送一个下令
3、处理惩罚处罚收到的下令并实行恣意须要办法
4、更新App Widget,以反响变革
在这个例子中,我们将修改之前文章所创建的App Widget(图1,顶上的App Widget ),包括一个带有三个控件的按钮栏(图1,底部App Widget)。按钮栏上的每个按钮将实行一项细致的办法,然后点击App Widget的恣意地方将潜伏按钮栏。左边的按钮(东西集)将启动配置活动,利用者可以改变幻灯片图像转换之间的时间隔绝。中间的按钮将停息或光复,幻灯片。右侧的按钮,容许利用者立即跳到下一张图像。
Figure 1: App Widget的三个差别状态
Working with RemoteViews
一个App Widget利用一种叫做RemoteViews的分外的表现控件。与通常视图差别的是,筹划RemoteViews控件的目标是表现另一个进程中的视图控件的聚集。因此,不克不及大抵地增长一个按钮处理惩罚处罚步调,由于该代码将在应用步调的进程中运行,而不是在表现RemoteViews东西的进程中(在这种环境下,主屏幕的进程中)。
为了实现RemoteViews控件的利用者交互,您必须注册,一个PendingIntent将会被触发,当包括RemoteViews东西的细致视图被点击时。这是通过调用RemoteViews东西的setOnClickPendingIntent()要领来完成的。比喻,增长PendingIntent启动活动来配置幻灯片的时间隔绝,我们会增长以下代码:
1 PendingIntent pendingIntent = PendingIntent.getActivity
2 (context, 0, configIntent,
3 PendingIntent.FLAG_UPDATE_CURRENT);
4 remoteView.
5 setOnClickPendingIntent(R.id.config, pendingIntent);
6
7
Working with PendingIntents
一个PendingIntent底子上是一个包装东西,连合一个带有目标的办法intent,比喻startActivity(),或broadcastIntent()。在前面的文章中,我们用PendingIntent,通过警报触发App Widget来变革图像表现。要是你还记得,当不止一个App Widge存在时,intent必须是唯一无二的,用于应用步调来区分差别App Widget的细致事例,(见图1)。这种实现是通过包括App Widge的Uri地区标识,让每个App Widget都有本身的时间隔绝。
下面的代码利用此雷同的要领来创建configIntent的启动时间扩展配置活动。每一个App Widget将推出正确的appWidgetId。
1 Intent configIntent =
2 new Intent(context, ImagesWidgetConfiguration.class);
3 configIntent.putExtra(
4 AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
5 configIntent.setData(Uri.withAppendedPath(Uri.Parse
6 (ImagesWidgetProvider.URI_SCHEME + "://widget/id/"),
7 String.valueOf(appWidgetId)));
8
如今,配置按钮可以变乱了,我们可以增长其他按钮栏的结果,诸如跳转到下一张图像。为了标记RemoteViews控件跳到下一张图像,我们将须要回放到App Widget来变革状态。
起首,它大概看起来状态信息可以被编码,就像Intent部分被按钮处理惩罚处罚步调发送。请记取, App Widget也将定期更新。intent将不会变革,也不会知道新的状态。为了办理这个标题,我们为App Widget创造一个新的action典范称为ACTION_WIDGET_CONTROL和附加下令给intent的Uri。然后,我们在SharedPreferences存储App Widget的状态。在实践中,App Widget的实现通常有富饶大抵的布局,以便没有明显的利用者扩展。
下面的资助要领演示了PendingIntent的创意,来处理惩罚处罚新的办法典范ACTION_WIDGET_CONTROL:
1 private PendingIntent makeControlPendingIntent
2 (Context context, String command, int appWidgetId) {
3 Intent active = new Intent();
4 active.setAction(ACTION_WIDGET_CONTROL);
5 active.putExtra(
6 AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
7 Uri data = Uri.withAppendedPath(
8 Uri.parse(URI_SCHEME + "://widget/id/#"+command),
9 String.valueOf(appWidgetId));
10 active.setData(data);
11 return(PendingIntent.getBroadcast(context,
12 0, active, PendingIntent.FLAG_UPDATE_CURRENT));
13 }
14
在上面的代码块创建了一个新的具有一个ACTION_WIDGET_CONTROL的Intent(是一个字符串)。接着,我们为App Widget的唯一ID设置Intent Extra的值。唯一的Uri被编译,融入所需的下令。这一intent将由App Widget主机是准备播放到Android体系。这将是由同一个广播汲取器处理惩罚处罚,处理惩罚处罚一样通常的App Widget下令。
App Widget将可以大概得到如许的广播在他的onReceive()要领:
1 else if (ACTION_WIDGET_CONTROL.equals(action)) {
2 final int appWidgetId = intent.getIntExtra(
3 AppWidgetManager.EXTRA_APPWIDGET_ID,
4 AppWidgetManager.INVALID_APPWIDGET_ID);
5 if (appWidgetId !=
6 AppWidgetManager.INVALID_APPWIDGET_ID) {
7 this.onHandleAction(
8 context, appWidgetId, intent.getData());
9 }
10
处理惩罚处罚状态
如今你相识利用者触发一个Intent东西转达给App Widget,以及它怎样被捕获,可以处理惩罚处罚的恳求利用。包括:
1、获获取当的RemoteViews实例
2、检索和变革其状态
3、将这些变革应用到RemoteViews控件
4、调用updateAppWidget()要领将变革应用到相应的App Widget。
处理惩罚处罚这些任务的每个代码在onHandleAction()和updateDisplayState()要领的实现,源代码可以下载此文章。
每次RemoteViews控件更新,是从原来的布局重新创建。然而,如今单击处理惩罚处罚步调就可以利用。基于App Widget如今的状态,所需的单击处理惩罚处罚步调因此雷同的要领增长,就像我们早期增长的配置活动。这些处理惩罚处罚步调也可用于review在源代码的updateDisplayState()要领中。
更新布局
为了实现该按钮在整个部件的底部画图栏的结果,我们启用了两FrameLayout控件,外层FrameLayout -包括整个App Widget-包括ImageView表现和另一个按钮栏FrameLayout。第二个FrameLayout将用于在其父窗口的底部绘制,它包括了三个ImageButton控件的设置,播放/停息和下一张图像。按钮栏FrameLayout可以通过大抵地设置其可见性属性从视图中潜伏了。完备的布局文件(widget.xml)可以在本文提供的示例代码中看到。
更新Android列表文件
着末,该体系将无法知道如许可以处理惩罚处罚我们的新的action典范,除非我们更新AndroidManifest.xml文件,包括得当的intent过滤器:
1 <receiver android:name=".ImagesWidgetProvider">
2 <intent-filter>
3 <action android:name=
4 "com.mamlambo.ImagesWidget.WIDGET_CONTROL" />
5 <data android:scheme="images_widget" />
6 </intent-filter>
7 </receiver>
8
这种intent过滤器指示应用步调,以观察播放带有action 典范为ACTION_WIDGET_CONTROL的 intent,其的值是“com.mamlambo.ImagesWidget.WIDGET_CONTROL”。
结论
App Widget增长了一个全新的范畴,Android的利用者体验。这些App Widget不须要是静态的,但可以包括交互结果以及对利用者的点击变乱作出应声等。在本文中,你学会了怎样增长利用者交互的Android App Widget。如许做,你学会了怎样利用PendingIntent 和RemoteViews交互。着末,你相识了intent机制的限定,以及怎样变乱,可以围绕创造一个App Widget,而使其主屏幕更稳固。