Control API是Smart Extension APIs中的一部分。前面一篇講到了Sony Extension API。Sony某些智能配件支持Control API。Control API讓Extension能夠徹底控制配件,包括控制屏幕、LED、振動、輸入。正是因爲是徹底控制設備,因此同一時刻只能有一個Extension運行。android
Control API包括如下內容:編程
Control Extension可使用配件以前,須要使用註冊API中的Content Provider插入一條記錄到Extension表中(原文:it must use the registration API content provider to insert a record in the extension table)。此外還應在註冊表中添加信息。每一個可與Extension交互的主應用(Host Application)均應完成上述過程。api
爲了知道有哪些主應用可用以及主應用支持哪些功能,Extension須要使用Capability API服務器
Extension成功註冊後便可與主應用通訊。再次強調,因爲Extension是徹底控制配件,因此同一時刻只有一個Extension運行架構
Extension並不能任意執行,它應先確認沒有其餘Extension在運行,這種狀況下當前Extension才能使用CONTROL_ START_ REQUEST_ INTENT來請求運行本身。 當主應用準備好將控制權交給 Extension後它將發出一個CONTROL_ START_ INTENT響應。見下圖併發
當Extension請求控制配件時,主應用能夠接受請求並交出控制權;或者因爲某些狀況,拒絕該請求併發出一個CONTROL_ ERROR_ INTENT響應。主應用能夠發出的錯誤碼請參考EXTRA_ ERROR_ CODEide
當Extension在配件上可見主應用時將發出CONTROL_ RESUME_ INTENT。能夠認爲這裏Extension控制一切了,而主應用不過是在配件和Extension之間傳遞信息。佈局
當一個高優先級的Extension臨時須要運行時或者主應用負責管理屏幕狀態而屏幕 關閉時,也能夠暫停Extension。這種狀況下主應用給Extension發送CONTROL_ PAUSE_ INTENT。也就是,當前Extension已關閉或者其餘Extension開始控制配件,因此當前Extension不再能更新屏幕了。當Extension強行更新屏幕時,主應用會忽略這些違反規定的調用。.net
當Extension處於暫停狀態時,它不能控制屏幕/LED/振動器/按鍵事件。一個例子是通話Extension,它具備高優先級。好比,當某個Extension正在運行,這時用戶接到一個電話。咱們但願可以暫停正在運行的Extension,讓通話Extension在屏幕上顯示來電號碼。當通話結束後,結束通話Extension並從新運行原來的Extension,原來的Extension會接收到CONTROL_ RESUME_ INTENT。
主應用發出CONTROL_ RESUME_ INTENT後,原來的Extension將從新控制一切了。
用戶退出Extension時主應用會發送一個CONTROL_ PAUSE_ INTENT和一個CONTROL_ STOP_ INTENT。這時主應用從新得到控制權。
當正在運行的Extension想結束本身,好比通話Extension,能夠向主應用發送CONTROL_ STOP_ REQUEST_ INTENT。主應用將中止它併發送一個CONTROL_ STOP_ INTENT。若是這個Extension還未中止,主應用發送CONTROL_ STOP_ INTENT以前將先發送CONTROL_ PAUSE_ INTENT。相應地,其餘被暫停的Extension將從新運行。
實現了Control API的Extension能夠控制配件的屏幕狀態。使用CONTROL_ SET_ SCREEN_ STATE_ INTENT控制屏幕。
不管在手機端仍是配件端,編程時應注意儘量消耗更少的電量,這點很是重要。配件的電池比手機小得多,因此使用各類功能時應當心。儘量讓主應用控制屏幕狀態。這樣的話,你就不心擔憂配件上的電量消耗問題。僅需將屏幕狀態設置爲"自動"便可。
其實缺省狀況下,Extension啓動時屏幕狀態會被設置爲"自動",因此主應用會控制屏幕開/關/暗等行爲。若是Extension想要控制屏幕狀態,它必須明確進行修改。
Extension中止時,主應用會自動接管屏幕控制。
注意:當處理"自動"狀態時,屏幕關時Extension將收到一個CONTROL_ PAUSE_ INTENT;屏幕開時會收到一個CONTROL_ RESUME_ INTENT。
某些配件可能支持這樣一種模式:信息能夠展現給用戶但同時保持電量消耗最少。 這種活動節能模式僅能以黑白色顯示內容。支持該模式的配件經過SUPPORTS_ LOW_ POWER_ MODE來標識將啓動活動節能模式。若是Extension想使用這種模式,它必須在註冊到主應用時將LOW_ POWER_ SUPPORT設置爲TRUE。
若是Extension和配件都支持活動節能模式,屏幕關時將激活這一模式。即,若是屏幕狀態是SCREEN_ STATE_ AUTO,配件將判斷什麼時候進入活動節能模式。若是屏幕狀態是SCREEN_ STATE _ON或SCREEN_ STATE _DIM,Extension能夠經過設置屏幕狀態爲SCREEN_ STATE _OFF來激活活動節能模式。不管是Extension仍是配件激活活動節能模式, Extension都會收到一個CONTROL_ ACTIVE _POWER _SAVE _MODE _STATUS _CHANGED _INTENT。另外,在活動節能模式下,Extension仍然可使用正常顯式模塊下的方法來更新屏幕。
若是屏幕狀態是SCREEN_ STATE _AUTO,而且是由配件主動進入活動節能模式,配件也能夠決定何時退出這種模式。注意,活動節能模式中Extension不會收到來自配件的任何輸入事件,由於這將致使退出活動節能模式。若是是由Extension主動進入活動節能模式,則仍然須要Extension決定何時退出該模式,退出時須要設置屏幕狀態爲SCREEN_ STATE _ON。若是Extension想在屏幕處於活動節能模式時仍然收到輸入事件,則只能由它本身主動進入該模式(而不是由配件主動進入)。當屏幕退出活動節能模式時,Extension都會收到CONTROL_ ACTIVE _POWER _SAVE _MODE _STATUS _CHANGED _INTENT,而且Extension應用更新屏幕內容。
配件上可能有一個或多個LED,可用於提醒用戶有新的事件發生。Extension能夠經過註冊API和Capability API來獲取配件上LED相關的信息。
若是配件上有LED,則Extension可使用Control API來控制LED。使用CONTROL_ LED_ INTENT進行控制。 注意主應用可能在任什麼時候候控制LED以提示用戶。而Extension不知道這種狀況,若是這時它嘗試控制LED,則主應用會忽略它的請求。
配件上可能有振動器。使用註冊API和Capability API來檢查是有振動器。若是有,則可使用CONTROL_ VIBRATE_ INTENT
配件上可能有若干物理鍵。當按下物理鍵時Extension會接收到CONTROL_ KEY_ EVENT_ INTENT表示的按鍵事件。
該Intent包含幾個參數,好比事件的時間戳,事件類型(按下,鬆開仍是重複),以及按鍵代碼。每一個按鍵有惟一的按鍵代碼。
某些配件具備觸屏。Extension經過註冊API和Capability API獲取相關信息。當用戶觸摸配件屏幕時Extension將收到CONTROL_ TOUCH_ EVENT_ INTENT
若是CONTROL_ DISPLAY_ DATA_ INTENT用於發送圖片,那麼觸摸事件則有帶有屏幕座標信息的CONTROL_ TOUCH_ EVENT_ INTENT發送。若是有滑動手勢,則會向Extension發送CONTROL_ SWIPE_ EVENT_ INTENT
若是CONTROL_ PROCESS_ LAYOUT_ INTENT用於發送佈局,則佈局中的某些View將處理觸摸事件。觸摸事件會被android:clickable設置爲true的View處理。對於這些View,Extension會收到CONTROL_ OBJECT_ CLICK_ EVENT_ INTENT。而ListView將觸摸事件處理爲CONTROL_ LIST_ ITEM_ CLICK_ INTENT。未被佈局中View處理的觸摸事件和滑動事件會發送給Extension本身來處理。
Extension不只控制配件自己,還能控制屏幕上顯示什麼內容。用戶可見的內容來自於Extension。基本上Extension是發送圖片以顯示在配件的屏幕上。爲獲取支持的屏幕大小和顏色深度,Extension須要使用註冊API和Capability API。Extension經過發送CONTROL_ DISPLAY_ DATA_ INTENT更新屏幕內容。
Extension能夠發送圖片的原始數據或僅僅發送URI。注意,咱們是使用藍牙來傳輸數據因此沒法達到較高的幀率。屏幕刷新率請見註冊API和Capability API。
Control API v2版本開始能夠發送佈局而不只僅是圖片了。由EXTRA_ DATA_ XML_ LAYOUT來指定佈局(僅支持標準Android佈局中的某些)。使用CONTROL_ PROCESS_ LAYOUT_ INTENT發送佈局。而佈局中View的內容則使用CONTROL_ SEND_ IMAGE_ INTENT和CONTROL_ SEND_ TEXT_ INTENT來更新。使用佈局時,點擊事件由CONTROL_ OBJECT_ CLICK_ EVENT_ INTENT發送。
佈局中能夠包含列表。列表由CONTROL_ LIST_ COUNT_ INTENT初始化。這個Intent能夠在EXTRA_ LIST_ CONTENT中包含列表數據。若是沒有提供EXTRA_ LIST_ CONTENT,則主應用會要求必要時使用CONTROL_ LIST_ REQUEST_ ITEM_ INTENT來逐一請求列表項數據。Extension能夠在任意時候發送一個CONTROL_ LIST_ COUNT_ INTENT來更新列表內容,如須要添加新的列表項或者已存在的列表項須要刷新。
ListView和其子元素必須佔滿屏幕的整個寬度。而列表項的高度小於或等於ListView的高度。
有些列表能夠支持用戶發起的更新。當用戶發起更新時,會向Extension發送一個[CONTROL_ LIST_ REFRESH_ REQUEST_ INTENT][CONTROL_LIST_REFRESH_REQUEST_INTENT]。Extension須要檢查數據源(好比向服務器拉數據)並更新列表內容。若是列表項數目發生變化,則會發送一個新的CONTROL_ LIST_ COUNT_ INTENT。若是隻是內容發生變化,則會發送幾個CONTROL_ LIST_ ITEM_ INTENT。
與List很是相似。
Control包含兩個內部接口,分別是
1.Control.Intents
Intents sent between Control Extensions and Accessory Host Applications.
2.Control.KeyCodes Interface used to define constants for keycodes (??? 不明白,爲何這個也要從新定義)