本章繼續講述在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文檔參考: