本章继续讲述在android界面设计中相关的知识点。介绍内容包括BroadcastReceiver(广播),Service(服务),Widget(小部件),WebView(网页加载控件)。html
在Android中,Broadcast是一种普遍运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。android
广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是经过调用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。一般一个广播 Intent 能够被订阅了此 Intent 的多个广播接收者所接收。网络
首先在须要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,而后经过调用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。app
当Intent发送之后,全部已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent 相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。因此当咱们定义一个BroadcastReceiver的时候,都须要实现onReceive()方法。ide
(3)广播注册函数
<receiver android:name="myRecevice"> //继承BroadcastReceiver,重写onReceiver方法布局
<intent-filter> 测试
<action android:name="com.dragon.net"></action> //使用过滤器,接收指定action广播ui
</intent-filter>this
</receiver>
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String); //为BroadcastReceiver指定action,使之用于接收同action的广播
registerReceiver(BroadcastReceiver,intentFilter);
通常:在onStart中注册,onStop中取消unregisterReceiver
指定广播目标Action:Intent intent = new Intent(actionString);
而且可经过Intent携带消息 :intent.putExtra("msg", "hi,我经过广播发送消息了");
A Service
is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service might handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.
翻译过来就是:Service(服务)是一个没有用户界面的在后台运行执行耗时操做的应用组件。其余应用组件可以启动Service,而且当用户切换到另外 的应用场景,Service将持续在后台运行。另外,一个组件可以绑定到一个service与之交互(IPC机制),例如,一个service可能会处理 网络操做,播放音乐,操做文件I/O或者与内容提供者(content provider)交互,全部这些活动都是在后台进行。
Service有两种状态,“启动的”和“绑定”。Service生命周期流程以下图所示:
绑定状态的service,经过调用bindService()来启动,一个绑定的service提供一个容许组件与service交互的接 口,能够发送请求、获取返回结果,还能够经过夸进程通讯来交互(IPC)。绑定的service只有当应用组件绑定后才能运行,多个组件能够绑定一个 service,当调用unbind()方法时,这个service就会被销毁了。
注册Service,启动Service,在AndroidManifest.xml中注册,注册代码以下:
<service android:name="com.example.trywidgetsimplest.MusicManageService" ></service>
启动服务:
Intent startIntent = new Intent(MainActivity.this,MusicManageService.class);
startService(startIntent);
中止服务:
Intent startIntent = new Intent(MainActivity.this,MusicManageService.class);
stopService(startIntent);
绑定服务:
绑定服务,便于数据交互或者访问其中的一些方法:
public boolean bindService(Intent intent, ServiceConnection conn, int flags) ;
public void unbindService(ServiceConnection conn);
intent是跳转到service的intent,如 Intent intent = new Intent();intent.setClass(this,MyService.class);
conn则是一个表明与service链接状态的类,当咱们链接service成功或失败时,会主动触发其内部的onServiceConnected或onServiceDisconnected方法。访问service中的数据,能够在onServiceConnected()方法中进行实现。
App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它能够被嵌入到其它应用程序中(好比桌面)并接收周期性的更新。你能够经过一个App Widget Provider来发布一个Widget。
这个玩意是用来定义桌面widget的大小,初始状态等等信息的,它的位置应该放在res/xml文件夹下,具体的xml参数以下:
示例XML:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen|keyguard"
android:initialKeyguardLayout="@layout/example_keyguard">
</appwidget-provider>
示例说明:
它们指定了App Widget布局须要的最小区域。缺省的App Widgets所在窗口的桌面位置基于有肯定高度和宽度的单元网格中。若是App Widget的最小长度或宽度和这些网格单元的尺寸不匹配,那么这个App Widget将上舍入(上舍入即取比该值大的最接近的整数)到最接近的单元尺寸。注意:app widget的最小尺寸,不建议比 “4x4” 个单元格要大。关于app widget的尺寸,后面在详细说明。
它们属性指定了 widget 的最小绝对尺寸。也就是说,若是 widget 小于该尺寸,便会由于变得模糊、看不清或不可用。 使用这两个属性,能够容许用户从新调整 widget 的大小,使 widget 的大小能够小于 minWidth 和 minHeight。注意:当 minResizeWidth 的值比 minWidth 大时,minResizeWidth 无效;当 resizeMode 的取值不包括 horizontal 时,minResizeWidth 无效。当 minResizeHeight 的值比 minHeight 大时,minResizeHeight 无效;当 resizeMode 的取值不包括 vertical 时,minResizeHeight 无效。
它定义了 widget 的更新频率。实际的更新时机不必定是精确的按照这个时间发生的。建议更新尽可能不要太频繁,最好是低于1小时一次。 或者能够在配置 Activity 里面供用户对更新频率进行配置。 实际上,当updatePeriodMillis的值小于30分钟时,系统会自动将更新频率设为30分钟!关于这部分,后面会详细介绍。
注意: 当更新时机到达时,若是设备正在休眠,那么设备将会被唤醒以执行更新。若是更新频率不超过1小时一次,那么对电池寿命应该不会形成多大的影响。 若是你须要比较频繁的更新,或者你不但愿在设备休眠的时候执行更新,那么可使用基于 alarm 的更新来替代 widget 自身的刷新机制。将 alarm 类型设置为 ELAPSED_REALTIME 或 RTC,将不会唤醒休眠的设备,同时请将 updatePeriodMillis 设为 0。
指向 widget 的布局资源文件
可选属性,定义了 widget 的配置 Activity。若是定义了该项,那么当 widget 建立时,会自动启动该 Activity。
指定预览图,该预览图在用户选择 widget 时出现,若是没有提供,则会显示应用的图标。该字段对应在 AndroidManifest.xml 中 receiver 的 android:previewImage 字段。由 Android 3.0 引入。
指定一个子view ID,代表该子 view 会自动更新。在 Android 3.0 中引入。
指定了 widget 的调整尺寸的规则。可取的值有: "horizontal", "vertical", "none"。"horizontal"意味着widget能够水平拉伸,“vertical”意味着widget能够竖值拉伸,“none”意味着 widget不能拉伸;默认值是"none"。Android 3.1 引入。
指定了 widget 能显示的地方:可否显示在 home Screen 或 lock screen 或 二者均可以。它的取值包括:"home_screen" 和 "keyguard"。Android 4.2 引入。
指向 widget 位于 lockscreen 中的布局资源文件。Android 4.2 引入。
经过appwidget-provider标签就能够获得初始化的布局,视图等,但widget要实时更新时,要响应用户操做时,就须要额外的类来辅助处理了,这个类就是AppWidgetProvider。因为AppWidgetProvider要接收到当前widget的状态(是否被添加,是否被删除等),因此要接收通知,必然是派生自BroadcastReceiver。
AppWidgetProvider中的广播处理函数以下:(根据不一样的使用状况,重写不一样的函数)
在3种状况下会调用OnUpdate()。onUpdate()是在main线程中进行,所以若是处理须要花费时间多于10秒,处理应在service中完成。(第二篇会讲为何还要有service)
当 widget 被删除时被触发。
当第1个 widget 的实例被建立时触发。也就是说,若是用户对同一个 widget 增长了两次(两个实例),那么onEnabled()只会在第一次增长widget时触发。
当最后1个 widget 的实例被删除时触发。
在接收到广播时,调用。
在 AppWidgetProviderInfo中已经介绍了,minWidth 和minHeight 用来指定了App Widget布局须要的最小区域。缺省的App Widgets所在窗口的桌面位置基于有肯定高度和宽度的单元网格中。若是App Widget的最小长度或宽度和这些网格单元的尺寸不匹配,那么这个App Widget将上舍入(上舍入即取比该值大的最接近的整数——译者注)到最接近的单元尺寸。
例如,不少手机提供4x4网格,平板电脑能提供8x7网格。当widget被添加到时,在知足minWidth和minHeight约束的前提下,它将被占领的最小数目的细胞。
粗略计算minWidth和minHeight,能够参考下面表格:
单元格个数 (行 / 列) |
对应的设置大小 (dp) ( minWidth / minHeight ) |
---|---|
1 | 40dp |
2 | 110dp |
3 | 180dp |
4 | 250dp |
… | … |
n | 70 × n − 30 |
详细计算minWidth和minHeight,要计算各个区域的大小。如下图为例:
计算结果:
minWidth = 144dp + (2 × 8dp) + (2 × 56dp) = 272dp
minHeight = 48dp + (2 × 4dp) = 56dp
Widget并不支持全部的布局和控件,而仅仅只是支持Android布局和控件的一个子集。
FrameLayout
LinearLayout
RelativeLayout
GridLayout
App Widget支持的控件
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper
除此以外的全部控件(包括自定义控件)都没法显示,没法显示时,添加出来的widget会显示“加载布局出错”
Widget文档参考:
http://blog.csdn.net/harvic880925/article/details/41445407
http://blog.csdn.net/sasoritattoo/article/details/17616597
Service文档参考: