精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Xamarin和Visual Studio開(kāi)發(fā)Android可穿戴設(shè)備應(yīng)用

譯文
移動(dòng)開(kāi)發(fā) Android
在本文中,我將向您詳細(xì)介紹使用Xamarin和Visual Studio開(kāi)發(fā)Android可穿戴設(shè)備應(yīng)用程序的完整過(guò)程。

搭建開(kāi)發(fā)環(huán)境

我們需要做的第一件事情是安裝必要的工具。因此,你需要首先安裝Visual Studio。如果您使用的是Visual Studio 2010,2012或2013,那么請(qǐng)確保它是一個(gè)專(zhuān)業(yè)版本或更高級(jí)版本,因?yàn)閂isual Studio的Xamarin擴(kuò)展并不支持精簡(jiǎn)版。有關(guān)詳細(xì)信息,請(qǐng)參閱 https://xamarin.com/faq。

對(duì)我本人來(lái)說(shuō),使用了Visual Studio 2013 Untimate版本。一旦你已經(jīng)安裝了受支持的 Visual Studio版本,那么請(qǐng)接著下載Visual Studio的Xamarin擴(kuò)展(下載地址是http://xamarin.com/visual-studio)。(你可以免費(fèi)試用或申請(qǐng)一個(gè)許可證版本)。

接下來(lái)的操作,只需按照下載的向?qū)е械恼f(shuō)明進(jìn)行即可,直到安裝完全為止。為了正常使用擴(kuò)展,您可能需要重新啟動(dòng)您的計(jì)算機(jī)。

現(xiàn)在,當(dāng)您正常啟動(dòng)Visual Studio,你應(yīng)該能夠在工具菜單下看到如圖所示的以下項(xiàng)目。

圖1:Android Tools和SDK

為確保您所需要的一切已經(jīng)正常安裝,您可以通過(guò)Android SDK Manager來(lái)驗(yàn)證。為此,只需打開(kāi)Tools > Android > Android SDK Manager。這將打開(kāi)下圖所示的窗口:

圖2:Android SDK Manager

現(xiàn)在,在確保你已經(jīng)安裝所需要的一切后,接下來(lái)你可以開(kāi)始使用Visual Studio中的Xamarin創(chuàng)建你自己的Android應(yīng)用程序了。

創(chuàng)建簡(jiǎn)單的Android可穿戴設(shè)備應(yīng)用

首先,讓我們創(chuàng)建一個(gè)新的Visual Studio項(xiàng)目,然后從模板中選擇Android > Wear App (Android)。你應(yīng)該能夠看到如下圖所示的東西。

圖3:Visual Studio模板列表

現(xiàn)在,只需單擊OK命令讓Visual Studio為你生成創(chuàng)建可穿戴應(yīng)用程序所需的文件。下面的圖像顯示了默認(rèn)生成的文件。注意:其中提供了你著手構(gòu)建可穿戴應(yīng)用程序的示例代碼。

圖4:默認(rèn)的可穿戴應(yīng)用程序代碼

很容易吧!官方文檔中提供的有關(guān)Xamarin.Android應(yīng)用程序分析的資料對(duì)應(yīng)的URL是http://developer.xamarin.com/guides/android/getting_started/。

運(yùn)行程序

為了在不需要真實(shí)設(shè)備的情況下即可運(yùn)行應(yīng)用程序,我們首先需要建立一個(gè)模擬器程序。您可以通過(guò)以下幾個(gè)步驟創(chuàng)建模擬器程序。

轉(zhuǎn)到命令Tools > Andriod > Andriod Emulator Manager或單擊工具欄上的AVD圖標(biāo)。請(qǐng)參閱下圖。

圖5:Andriod內(nèi)置模擬器程序

之后,應(yīng)顯示安卓系統(tǒng)設(shè)備管理器窗口。在這里,我們可以編輯、啟動(dòng)、 創(chuàng)建、刪除或修復(fù)虛擬設(shè)備。

現(xiàn)在,我們需要單擊"Create"按鈕。下圖中的窗口應(yīng)打開(kāi),允許您選擇您想要?jiǎng)?chuàng)建的設(shè)備。在本例中,我們只需要?jiǎng)?chuàng)建一個(gè)虛擬Android可穿戴設(shè)備,用于在模擬器上運(yùn)行我們的應(yīng)用程序。

圖6:AVD對(duì)話框

一旦一切設(shè)置好,只需單擊OK便可創(chuàng)建虛擬設(shè)備。在下圖中,你應(yīng)該能夠看到您剛通過(guò)AVD管理器創(chuàng)建的設(shè)備。

圖7:AVD管理器

現(xiàn)在,只需單擊命令Start > Launch便可在后臺(tái)運(yùn)行模擬程序。注意,系統(tǒng)可能需要一些時(shí)間來(lái)加載模擬器。模擬程序加載并準(zhǔn)備好之后,你應(yīng)該能夠看到您剛創(chuàng)建的虛擬設(shè)備的名稱顯示于開(kāi)始調(diào)試下拉列表中。

圖8:新創(chuàng)建的虛擬設(shè)備

現(xiàn)在,將您的應(yīng)用程序設(shè)置為啟動(dòng)項(xiàng)目,然后按F5鍵運(yùn)行它。下圖展示了示例可穿戴應(yīng)用程序在模擬器程序中的輸出結(jié)果。

圖9:輸出

請(qǐng)記住,集成到Visual Studio內(nèi)部的默認(rèn)模擬器速度有點(diǎn)慢,僅適用于測(cè)試小型應(yīng)用程序。在實(shí)際開(kāi)發(fā)中創(chuàng)建并測(cè)試應(yīng)用程序的話,我會(huì)推薦你使用Xamarin安卓播放機(jī)(https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/debug-on-emulator/)來(lái)模擬android應(yīng)用程序。

就這樣!如果您想要參考更多的可穿戴設(shè)備應(yīng)用程序?qū)嵗?,只需訪問(wèn)此鏈接:http://developer.xamarin.com/samples/android/Android%20Wear/。

同步Android可穿戴設(shè)備和手持設(shè)備間的數(shù)據(jù)

讓我們?cè)倥σ稽c(diǎn),創(chuàng)建一個(gè)支持在您的可穿戴程序和手持設(shè)備之間進(jìn)行通信的可工作的應(yīng)用程序。這個(gè)練習(xí)將演示如何同步你的安卓應(yīng)用程序之間的數(shù)據(jù)。

創(chuàng)建Android可穿戴設(shè)備程序

開(kāi)始,讓我們啟動(dòng)Visual Studio 2013,然后選擇命令"File" -> "New" -> "Project..."。在模板中選擇 C# > Android并選擇Wear App (Android) Project。

命名您的應(yīng)用程序,然后單擊OK讓Visual Studio為您生成所需的文件。在本練習(xí)中,程序名為"WearDemo"。下面的圖像顯示了默認(rèn)示例代碼生成的文件,用于幫助您編寫(xiě)可穿戴設(shè)備應(yīng)用程序。

圖 10:可穿戴設(shè)備應(yīng)用程序項(xiàng)目

在我們開(kāi)始修改默認(rèn)代碼之前,我想指出:有兩種方法可以實(shí)現(xiàn)可穿戴設(shè)備和手持設(shè)備之間進(jìn)行通信,分別是DataApi和MessageApi。以下是每個(gè)API的簡(jiǎn)短描述。

DataApi:它所輸出的API供組件讀取或?qū)懭霐?shù)據(jù)項(xiàng)(Items)及相關(guān)資源(Assets)。其中,DataItem提供數(shù)據(jù)存儲(chǔ),支持掌上電腦和手持設(shè)備之間自動(dòng)同步。Assets用于發(fā)送例如圖像這樣的Blob數(shù)據(jù)。你只需要將Assets關(guān)聯(lián)到DataItems,則系統(tǒng)會(huì)自動(dòng)為你實(shí)現(xiàn)其他的處理。有關(guān)細(xì)節(jié),請(qǐng)閱讀這個(gè)URL(https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi)。

MessageApi:它提供的API供組件將消息發(fā)送到其他節(jié)點(diǎn)。消息通常應(yīng)該包含小型有效數(shù)據(jù)。你應(yīng)使用Assets與 DataApi來(lái)存儲(chǔ)大數(shù)據(jù)。有關(guān)細(xì)節(jié),請(qǐng)閱讀這個(gè)URL(https://developers.google.com/android/reference/com/google/android/gms/wearable/MessageApi)。

在下面提供的這個(gè)特別的演示例程中,我要使用DataApi來(lái)發(fā)送/同步設(shè)備之間的數(shù)據(jù)。由于DataApi是Google Play Services的一部分,那么我們需要做的第一件事是添加以下命名空間引用:

  1. using Android.Gms.Common.Apis; 
  2.  
  3. using Android.Gms.Wearable; 

Android.Gms.Common.Apis允許我們使用GoogleApiClient,這是集成Google Play Services的主入口點(diǎn)。Android.Gms.Wearable使我們能夠使用WearableClass類(lèi)。下一步是要擴(kuò)展我們的MainActivity類(lèi),即需要繼承以下接口:

1. IDataApiDataListener

2. IGoogleApiClientConnectionCallbacks

3. IGoogleApiClientOnConnectionFailedListener

IDataApiDataListener用來(lái)接收數(shù)據(jù)事件。IGoogleApiClientConnectionCallbacks接口提供的回調(diào)函數(shù)在客戶端連接或斷開(kāi)服務(wù)時(shí)調(diào)用。IGoogleApiClientOnConnectionFailedListener接口提供的回調(diào)函數(shù)在客戶端連接到服務(wù)失敗時(shí)調(diào)用。

概括一下,將數(shù)據(jù)發(fā)送到手持設(shè)備的示例代碼歸納如下:

  1. using System; 
  2.  
  3. using Android.Runtime; 
  4.  
  5. using Android.Widget; 
  6.  
  7. using Android.OS; 
  8.  
  9. using Android.Support.Wearable.Views; 
  10.  
  11. using Java.Interop; 
  12.  
  13. using Android.Gms.Common.Apis; 
  14.  
  15. using Android.Gms.Wearable; 
  16.  
  17. using System.Linq; 
  18.  
  19. namespace WearDemo 
  20.  
  21.  
  22. [Activity(Label = "WearDemo", MainLauncher = true, Icon = "@drawable/icon")] 
  23.  
  24. public class MainActivity : Activity,IDataApiDataListener, IGoogleApiClientConnectionCallbacks, IGoogleApiClientOnConnectionFailedListener 
  25.  
  26.  
  27. private IGoogleApiClient _client; 
  28.  
  29. const string _syncPath = "/WearDemo/Data"
  30.  
  31. protected override void OnCreate(Bundle bundle) { 
  32.  
  33. base.OnCreate(bundle); 
  34.  
  35. _client = new GoogleApiClientBuilder(this, this, this) 
  36.  
  37. .AddApi(WearableClass.Api) 
  38.  
  39. .Build(); 
  40.  
  41. // Set our view from the "main" layout resource 
  42.  
  43. SetContentView(Resource.Layout.Main); 
  44.  
  45. var v = FindViewById<WatchViewStub>(Resource.Id.watch_view_stub); 
  46.  
  47. v.LayoutInflated += delegate { 
  48.  
  49. // Get our button from the layout resource, 
  50.  
  51. // and attach an event to it 
  52.  
  53. Button button = FindViewById<Button>(Resource.Id.myButton); 
  54.  
  55. button.Click += delegate { 
  56.  
  57. SendData(); 
  58.  
  59. }; 
  60.  
  61. }; 
  62.  
  63.  
  64. public void SendData() { 
  65.  
  66. try { 
  67.  
  68. var request = PutDataMapRequest.Create(_syncPath); 
  69.  
  70. var map = request.DataMap; 
  71.  
  72. map.PutString("Message""Vinz says Hello from Wearable!"); 
  73.  
  74. map.PutLong("UpdatedAt", DateTime.UtcNow.Ticks); 
  75.  
  76. WearableClass.DataApi.PutDataItem(_client, request.AsPutDataRequest()); 
  77.  
  78.  
  79. finally { 
  80.  
  81. _client.Disconnect(); 
  82.  
  83.  
  84.  
  85. protected override void OnStart() { 
  86.  
  87. base.OnStart(); 
  88.  
  89. _client.Connect(); 
  90.  
  91.  
  92. public void OnConnected(Bundle p0) { 
  93.  
  94. WearableClass.DataApi.AddListener(_client, this); 
  95.  
  96.  
  97. public void OnConnectionSuspended(int reason) { 
  98.  
  99. Android.Util.Log.Error("GMSonnection suspended " + reason); 
  100.  
  101. WearableClass.DataApi.RemoveListener(_client, this); 
  102.  
  103.  
  104. public void OnConnectionFailed(Android.Gms.Common.ConnectionResult result) { 
  105.  
  106. Android.Util.Log.Error("GMSonnection failed " + result.ErrorCode); 
  107.  
  108.  
  109. protected override void OnStop() { 
  110.  
  111. base.OnStop(); 
  112.  
  113. _client.Disconnect(); 
  114.  
  115.  
  116. public void OnDataChanged(DataEventBuffer dataEvents) { 
  117.  
  118. var dataEvent = Enumerable.Range(0, dataEvents.Count
  119.  
  120. .Select(i => dataEvents.Get(i).JavaCast<IDataEvent) 
  121.  
  122. .FirstOrDefault(x => x.Type == DataEvent.TypeChanged && x.DataItem.Uri.Path.Equals(_syncPath)); 
  123.  
  124. if (dataEvent == null
  125.  
  126. return
  127.  
  128. //do stuffs here 
  129.  
  130.  
  131.  

現(xiàn)在來(lái)解釋一下上面代碼中發(fā)生的事情。在OnCreate事件中,我們構(gòu)建了一個(gè)Google Play Services客戶端,它包括可穿戴設(shè)備API。然后,我們?cè)诎粹o的click事件處理程序中調(diào)用SendData()方法實(shí)現(xiàn)數(shù)據(jù)發(fā)送。其中,SendData()方法包含發(fā)送數(shù)據(jù)的實(shí)際邏輯。具體實(shí)現(xiàn)中,我們通過(guò)傳遞數(shù)據(jù)對(duì)象路徑(即WearDemo/Data)創(chuàng)建了一個(gè)DataMapRequest請(qǐng)求。實(shí)際的數(shù)據(jù)是DataMap,其中包含了一個(gè)Message值和一個(gè)UpdatedAt值。接收方可以使用路徑來(lái)確定本文中稍后要介紹的數(shù)據(jù)來(lái)源。

事件

1.OnStart:當(dāng)活動(dòng)啟動(dòng)時(shí)觸發(fā)此事件,用于連接到數(shù)據(jù)層。

2.OnConnected:當(dāng)數(shù)據(jù)層的連接成功時(shí)觸發(fā)此事件。

3.OnStop:斷開(kāi)數(shù)據(jù)層連接時(shí)觸發(fā)此事件,此時(shí)活動(dòng)停止 。你可以使用OnConnectionSuspended和OnConnectionFailed來(lái)實(shí)現(xiàn)對(duì)應(yīng)的連接回調(diào)(例如在本演示中我們記錄錯(cuò)誤及分離服務(wù))。

4.OnDataChanged:當(dāng)數(shù)據(jù)更改時(shí)觸發(fā)此事件。

需要牢記的事情

1.路徑應(yīng)該總是以正斜線(/)字符開(kāi)頭。

2.時(shí)間戳是發(fā)送數(shù)據(jù)時(shí)必須使用的,因?yàn)镺nDataChanged()事件僅在數(shù)據(jù)真正更改時(shí)觸發(fā)。將時(shí)間戳添加到數(shù)據(jù)將確保調(diào)用了該方法。

在文件AndroidManifest.xml的<application>元素下添加下列元數(shù)據(jù):

  1. <meta-data android:name="com.google.android.gms.version" 
  2.  
  3. android:value="@integer/google_play_services_version" /> 

創(chuàng)建主程序項(xiàng)目

為了測(cè)試同步和數(shù)據(jù)發(fā)送,我們需要?jiǎng)?chuàng)建一個(gè)主安卓應(yīng)用程序,由它來(lái)負(fù)責(zé)接收來(lái)自可穿戴設(shè)備的數(shù)據(jù)對(duì)象。其中,這個(gè)主程序?qū)惭b在手持設(shè)備(例如手機(jī)或平板電腦)中。

現(xiàn)在,右鍵單擊解決方案項(xiàng)目,選擇命令“Add->New Project”。在“Add->New Project”窗口中選擇“Visual C# > Android > Blank App (Android)”。你應(yīng)該能夠看到如下圖這個(gè)樣子:

圖 11: Android主程序項(xiàng)目

為簡(jiǎn)單起見(jiàn),我命名項(xiàng)目為MainAppDemo。此后,只需單擊OK命令讓系統(tǒng)為您生成所需的文件。最終,你在解決方案界面中將看到如圖所示結(jié)果。

圖 12: 解決方案資源管理器

在我們開(kāi)始將邏輯添加到主應(yīng)用程序之前,我想突出強(qiáng)調(diào)以下兩點(diǎn):

第一點(diǎn):你的可穿戴設(shè)備應(yīng)用程序和主應(yīng)用程序的命名空間應(yīng)該是相同的。在此示例中,可穿戴應(yīng)用程序使用的命名空間是"WearDemo"。所以,一定要重命名您的主程序的命名空間為"WearDemo",從而使之匹配。若要更改默認(rèn)的命名空間,您可以參考下列這些步驟:

(1)轉(zhuǎn)到命令“Project->Properties->Default Namespace”。

(2)若要更改其他項(xiàng),你可以使用CTRL + H快捷鍵把默認(rèn)命名空間替換為WearDemo。

(3)您也可以使用重構(gòu)代碼技術(shù)來(lái)更改命名空間。這只需要用鼠標(biāo)右鍵單擊命名空間并選擇“Refactor->Rename”命令即可。

第二點(diǎn):你的可穿戴設(shè)備程序和主應(yīng)用程序的包名也應(yīng)該相同。你可以找到該軟件包的名稱,這只需要右鍵單擊該項(xiàng)目并選擇選擇“Properties->Android Manifest”命令,如下面的圖像所示:

圖 13: Android配置文件

請(qǐng)確保這兩個(gè)軟件包名稱均被設(shè)置為"WearDemo.WearDemo"。一定要確保兩個(gè)項(xiàng)目生成成功。一旦你做完這一步,你就可以繼續(xù)往下操作——開(kāi)始修改項(xiàng)目了。首先,要將"Compile using Android version"更改為"API Level 21 (Xamarin.Android v5.0 Support) "API。請(qǐng)參考下面的圖片:

圖 14 ︰應(yīng)用程序設(shè)置

在引用位置,檢查你是否引用了Xamarin.Android.Support.V4。如果沒(méi)有這樣做,你也可以右鍵單擊References,然后選擇Manage NUGET Packages。然后,在“Online> Nuget.Org”下搜索"Xamarin.Android.Support.V4"。你應(yīng)該能夠看到這樣的內(nèi)容:

圖 15: NuGet程序包管理器

只需單擊安裝并等待,直到任務(wù)完成?,F(xiàn)在,你需要做同樣的操作并安裝"Xamarin.Android.Wear-1.0.0"。

添加服務(wù)WearableListenerService

擴(kuò)展WearableListenerService服務(wù)能夠讓你偵聽(tīng)數(shù)據(jù)層中的任何更新。由系統(tǒng)來(lái)管理服務(wù)的生命周期:當(dāng)需要發(fā)送數(shù)據(jù)項(xiàng)或消息時(shí)實(shí)現(xiàn)綁定到服務(wù);而當(dāng)沒(méi)有工作做時(shí)實(shí)現(xiàn)解除到服務(wù)的綁定。更多細(xì)節(jié),請(qǐng)參考這個(gè)URL(https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService)。

此后,我們將使用WearableListenerService來(lái)監(jiān)聽(tīng)從數(shù)據(jù)層發(fā)來(lái)的更新事件并處理數(shù)據(jù)。那么,下一步是添加擴(kuò)展WearableListenerService的類(lèi)。為此,右鍵單擊項(xiàng)目根目錄并選擇“Add->Class”,然后命名為"WearService"。下面給出此類(lèi)完整的邏輯實(shí)現(xiàn)代碼。

  1. using System.Linq; 
  2.  
  3. using Android.App; 
  4.  
  5. using Android.Content; 
  6.  
  7. using Android.Runtime; 
  8.  
  9. using Android.Gms.Wearable; 
  10.  
  11. using Android.Gms.Common.Apis; 
  12.  
  13. using Android.Support.V4.Content; 
  14.  
  15. namespace WearDemo 
  16.  
  17.  
  18. [Service] 
  19.  
  20. [IntentFilter(new[] { "com.google.android.gms.wearable.BIND_LISTENER" })] 
  21.  
  22. public class WearService : WearableListenerService 
  23.  
  24.  
  25. const string _syncPath = "/WearDemo/Data"
  26.  
  27. IGoogleApiClient _client; 
  28.  
  29. public override void OnCreate() { 
  30.  
  31. base.OnCreate(); 
  32.  
  33. _client = new GoogleApiClientBuilder(this.ApplicationContext) 
  34.  
  35. .AddApi(WearableClass.Api) 
  36.  
  37. .Build(); 
  38.  
  39. _client.Connect(); 
  40.  
  41. Android.Util.Log.Info("WearIntegrationreated"); 
  42.  
  43.  
  44. public override void OnDataChanged(DataEventBuffer dataEvents) { 
  45.  
  46. var dataEvent = Enumerable.Range(0, dataEvents.Count
  47.  
  48. .Select(i => dataEvents.Get(i).JavaCast<IDataEvent) 
  49.  
  50. .FirstOrDefault(x => x.Type == DataEvent.TypeChanged && x.DataItem.Uri.Path.Equals(_syncPath)); 
  51.  
  52. if (dataEvent == null
  53.  
  54. return
  55.  
  56. //get data from wearable 
  57.  
  58. var dataMapItem = DataMapItem.FromDataItem(dataEvent.DataItem); 
  59.  
  60. var map = dataMapItem.DataMap; 
  61.  
  62. string message = dataMapItem.DataMap.GetString("Message"); 
  63.  
  64. Intent intent = new Intent(); 
  65.  
  66. intent.SetAction(Intent.ActionSend); 
  67.  
  68. intent.PutExtra("WearMessage", message); 
  69.  
  70. LocalBroadcastManager.GetInstance(this).SendBroadcast(intent); 
  71.  
  72.  
  73.  

上面的代碼實(shí)現(xiàn)了OnDataChanged事件,此事件負(fù)責(zé)過(guò)濾從"TypeChanged"事件發(fā)來(lái)的數(shù)據(jù)事件。具體地講,它會(huì)檢查"/ WearDemo /Data"這個(gè)數(shù)據(jù)對(duì)象路徑,然后在本地進(jìn)行廣播。

創(chuàng)建主Activity

下面給出的是主Activity的代碼部分:

  1. using Android.App;   
  2. using Android.Content;   
  3. using Android.Widget;   
  4. using Android.OS;   
  5. using Android.Support.V4.Content;   
  6.    
  7. namespace WearDemo   
  8. {   
  9.     [Activity(Label = "MainAppDemo", MainLauncher = true, Icon = "@drawable/icon")]   
  10.     public class MainActivity : Activity   
  11.     {   
  12.         TextView _txtMsg;   
  13.    
  14.         protected override void OnCreate(Bundle bundle) {   
  15.             base.OnCreate(bundle);   
  16.    
  17.             // Set our view from the "main" layout resource   
  18.             SetContentView(Resource.Layout.Main);   
  19.    
  20.             // Get our TextBox from the layout resource,   
  21.             _txtMsg = FindViewById<TextView>(Resource.Id.txtMessage);   
  22.    
  23.    
  24.             IntentFilter filter = new IntentFilter(Intent.ActionSend);   
  25.             MessageReciever receiver = new MessageReciever(this);   
  26.             LocalBroadcastManager.GetInstance(this).RegisterReceiver(receiver, filter);   
  27.         }   
  28.    
  29.         public void ProcessMessage(Intent intent) {   
  30.             _txtMsg.Text = intent.GetStringExtra("WearMessage");   
  31.         }   
  32.    
  33.         internal class MessageReciever : BroadcastReceiver   
  34.         {   
  35.             MainActivity _main;   
  36.             public MessageReciever(MainActivity owner) { this._main = owner; }   
  37.             public override void OnReceive(Context context, Intent intent) {   
  38.                 _main.ProcessMessage(intent);   
  39.             }   
  40.         }   
  41.     }   

在上面的代碼中,我們進(jìn)行了注冊(cè),以便在OnCreate()事件中接收來(lái)自于ListenerService的廣播消息,然后定義了一個(gè)繼承自BroadcastReceiver類(lèi)的嵌套類(lèi),實(shí)現(xiàn)了OnReceive()方法并提取有關(guān)數(shù)據(jù)。最后,Process()方法負(fù)責(zé)處理顯示數(shù)據(jù)到UI的問(wèn)題。

布局

打開(kāi)文件Main.xaml,并使用如下內(nèi)容替換原來(lái)內(nèi)容:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  4.  
  5. android:orientation="vertical" 
  6.  
  7. android:layout_width="fill_parent" 
  8.  
  9. android:layout_height="fill_parent"
  10.  
  11. <TextView 
  12.  
  13. android:id="@+id/txtMessage" 
  14.  
  15. android:layout_width="fill_parent" 
  16.  
  17. android:layout_height="wrap_content" 
  18.  
  19. android:layout_marginTop="50dp" 
  20.  
  21. android:gravity="center" 
  22.  
  23. android:textColor="@android:color/white" 
  24.  
  25. android:textSize="80sp" /> 
  26.  
  27. </LinearLayout> 

上面的標(biāo)記中沒(méi)有什么特別的內(nèi)容。歸納來(lái)看,主要是包含了一個(gè)用于顯示消息的文本框。

添加Google Play服務(wù)所需要的元數(shù)據(jù)

最后,我們?cè)谂渲梦募嗀ndroidManifest.xml下的 <application>元素中添加元數(shù)據(jù),代碼如下:

  1. <meta-data android:name="com.google.android.gms.version" 
  2.  
  3. android:value="@integer/google_play_services_version" /> 

接下來(lái),我要介紹如何把每一個(gè)應(yīng)用程序部署到每一臺(tái)設(shè)備并進(jìn)行結(jié)果測(cè)試。

測(cè)試、調(diào)試與部署程序

在本節(jié)中,我們將學(xué)習(xí)如何在實(shí)際設(shè)備中部署和測(cè)試應(yīng)用程序。首先需要說(shuō)明的是,我使用Nexus 9和LG G Watch作為我的測(cè)試設(shè)備。

在我們開(kāi)始之前,請(qǐng)確保在您的機(jī)器上為安卓系統(tǒng)安裝了USB驅(qū)動(dòng)程序。您可以通過(guò)右鍵單擊命令“Computer > Manage > Device Manager > Other Devices”進(jìn)行驗(yàn)證。如果驅(qū)動(dòng)程序不在列表中,那么你必須先下載驅(qū)動(dòng)程序(參考這個(gè)地址:http://developer.android.com/sdk/win-usb.htmland)并進(jìn)行安裝(安裝方法請(qǐng)參閱鏈接: http://developer.android.com/tools/extras/oem-usb.html#InstallingDriver)。

接下來(lái)一個(gè)重要的事情是,在您的手持設(shè)備中啟用USB調(diào)試。您可以使用命令“Settings > Developer Options > Usb Debugging”啟用此功能。一旦你安裝了必需的驅(qū)動(dòng)程序并啟用了您的設(shè)備的調(diào)試支持,那么你只需將您的手持設(shè)備插入您的PC或筆記本電腦即可。在Visual Studio中,你應(yīng)該能夠看到所連接的手持設(shè)備顯示如下圖所示:

圖16: 接通手持設(shè)備后的項(xiàng)目界面

把主程序部署到手持設(shè)備

以下是部署主應(yīng)用程序的主要步驟:

(1)右鍵單擊主應(yīng)用程序項(xiàng)目并選擇“Properties > Android Options”選項(xiàng)。然后,在Packaging選項(xiàng)卡下取消選中" Use Fast Deployment (debug mode only)"。

(2)卸載項(xiàng)目。

(3)編輯.csproj文件并在其中添加PropertyGroup部分:

  1. <PropertyGroup> 
  2.  
  3. <JavaMaximumHeapSize>1G</JavaMaximumHeapSize> 
  4.  
  5. </PropertyGroup> 

(4)保存文件,然后加載該項(xiàng)目。

(5)右鍵單擊主應(yīng)用程序項(xiàng)目并將其設(shè)置為啟動(dòng)項(xiàng)目。

(6)構(gòu)建應(yīng)用程序。

(7)單擊運(yùn)行或播放按鈕。系統(tǒng)將開(kāi)始打包并將應(yīng)用程序安裝到設(shè)備上。只需稍等一會(huì)兒就會(huì)完成。

部署可穿戴設(shè)備應(yīng)用程序

您可以按照如上面同樣的過(guò)程來(lái)部署可穿戴應(yīng)用程序。不過(guò),如果你想要通過(guò)藍(lán)牙來(lái)部署和調(diào)試您的應(yīng)用程序的話,還需要如下一些額外的步驟:

1) 在您的手持設(shè)備中打開(kāi)Android Wear關(guān)聯(lián)程序。

2) 從右上角的菜單中選擇Settings。

3) 啟用"Debugging Over Bluetooth"。你應(yīng)該能夠看到像下面這樣的輸出狀態(tài):

Host: disconnected

Target: connected

4) 把掌上電腦通過(guò)USB連接到您的PC或筆記本電腦。

5) 在Visual Studio中,轉(zhuǎn)到“Tools > Android > Android Adb Command Prompt”處,運(yùn)行以下命令:

adb forward tcp:4444 localabstract:/adb-hub

adb connect localhost:4444

6) 然后,你應(yīng)該能夠看到可穿戴設(shè)備顯示在設(shè)備列表中,如下面的圖像所示:

圖17:顯示連接成功的設(shè)備

7) 重復(fù)與上面步驟1- 5相同的步驟,把主程序部署到手持設(shè)備。

8) 現(xiàn)在,設(shè)置你的可穿戴設(shè)備應(yīng)用程序?yàn)閱?dòng)項(xiàng)目,構(gòu)建應(yīng)用程序并運(yùn)行起來(lái)。

一旦安裝結(jié)束,你應(yīng)該能夠在Visual Studio 設(shè)置斷點(diǎn)開(kāi)始調(diào)試和測(cè)試您的應(yīng)用程序。下面是示例應(yīng)用程序的輸出結(jié)果:

圖18:最終的輸出結(jié)果

最后,你可以從Github下載本文示范項(xiàng)目源碼,供您學(xué)習(xí)參考。

小結(jié)

在這篇文章中,你已經(jīng)學(xué)習(xí)了下列內(nèi)容:

1.大概了解了可穿戴設(shè)備和安卓系統(tǒng)

2.設(shè)置開(kāi)發(fā)環(huán)境

3.創(chuàng)建一個(gè)簡(jiǎn)單的Android可穿戴設(shè)備應(yīng)用程序

4.創(chuàng)建了一個(gè)應(yīng)用程序,它能夠保持可穿戴設(shè)備和Android手持設(shè)備之間的數(shù)據(jù)同步

5.測(cè)試、調(diào)試和部署橫跨可穿戴設(shè)備和手持設(shè)備的Android應(yīng)用程序。

責(zé)任編輯:趙立京 來(lái)源: 51CTO
相關(guān)推薦

2021-02-03 00:18:05

可穿戴設(shè)備醫(yī)療應(yīng)用物聯(lián)網(wǎng)

2024-05-09 10:28:09

IIoT可穿戴設(shè)備工業(yè)物聯(lián)網(wǎng)

2014-11-12 13:37:57

可穿戴設(shè)備英特爾

2014-05-05 11:02:02

2015-06-16 17:15:39

無(wú)線技術(shù)可穿戴設(shè)備

2020-02-25 16:48:11

物聯(lián)網(wǎng)可穿戴設(shè)備智能眼鏡

2021-11-22 21:59:47

物聯(lián)網(wǎng)醫(yī)學(xué)可穿戴設(shè)備

2013-08-23 10:45:30

可穿戴設(shè)備

2021-03-16 11:24:53

物聯(lián)網(wǎng)可穿戴設(shè)備IOT

2015-10-22 11:08:19

2018-11-16 09:00:05

可穿戴設(shè)備智能測(cè)試

2024-03-12 09:08:36

可穿戴技術(shù)人工智能

2013-08-19 09:05:31

大數(shù)據(jù)

2015-10-20 15:31:23

可穿戴設(shè)備物聯(lián)網(wǎng)

2015-08-27 10:42:00

可穿戴設(shè)備無(wú)線技術(shù)

2021-02-01 16:49:52

可穿戴設(shè)備COVID-19遠(yuǎn)程監(jiān)控

2015-01-05 09:56:20

可穿戴設(shè)備

2014-05-20 17:04:08

智能硬件可穿戴設(shè)備反面教材

2014-07-03 14:38:50

2014-02-17 09:15:20

MWC可穿戴設(shè)備
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美国产精品va在线观看| 欧美日韩大陆在线| 美日韩免费视频| 姑娘第5集在线观看免费好剧| 免费在线观看一级毛片| 日韩精彩视频在线观看| xvideos亚洲| 黄色在线免费播放| 素人一区二区三区| 一区二区三区四区av| 久久手机视频| 99er热精品视频| 性欧美videos另类喷潮| 久久久av网站| 成年人免费观看视频网站| 日韩国产大片| 午夜av一区二区三区| 一区二区三区四区国产| 日韩在线一区二区三区四区| 免费成人你懂的| 欧美大片免费观看在线观看网站推荐| 久久av无码精品人妻系列试探| 日韩精品中文字幕一区二区| 中文字幕免费不卡在线| 不卡的av一区| 一级二级三级视频| 日韩精品免费一区二区在线观看| 日韩精品中文字幕在线不卡尤物| 日本肉体xxxx裸体xxx免费| av手机免费在线观看| 国产成人自拍在线| 国产精品扒开腿做爽爽爽男男| 久久久久久久久久久网 | 国户精品久久久久久久久久久不卡| 亚洲欧美日韩视频一区| 成熟妇人a片免费看网站| 国产免费av国片精品草莓男男| 91久久精品国产91性色tv| 精品无码国模私拍视频| 日本高清在线观看视频| 中文字幕一区二区三区色视频 | 国产精品一区二区在线| 国产农村妇女aaaaa视频| 影音先锋在线一区| 色综合久久中文字幕综合网小说| 99久久99久久精品免费| 欧美美女一区| 亚洲色图欧美制服丝袜另类第一页| 稀缺小u女呦精品呦| 77成人影视| 日韩久久久精品| 韩国三级hd中文字幕有哪些| 国产精品视频首页| 欧美一卡二卡三卡| 能看毛片的网站| 精品视频国内| 精品国产网站在线观看| 欧美激情 亚洲| 国产一级成人av| 日韩成人中文字幕在线观看| 亚洲av网址在线| 你微笑时很美电视剧整集高清不卡| 亚洲精品自拍视频| 日本黄色网址大全| 国内黄色精品| 日日骚久久av| 紧身裙女教师波多野结衣| 综合激情一区| 欧美精品激情视频| 国产精品久久久免费视频| 国产视频一区在线观看一区免费| 欧美亚洲成人精品| 波多野结衣在线观看视频| 久久精品国产秦先生| 亚洲专区国产精品| 欧美一级特黄aaaaaa| 久久久久国产精品免费免费搜索 | 图片区亚洲欧美小说区| 超薄丝袜一区二区| 日韩免费观看一区二区| 久久精品日产第一区二区| 国产精品久久久久久久久| 一级黄色片免费看| 国产精品77777| 精品一卡二卡三卡四卡日本乱码 | 精品久久无码中文字幕| 成人免费观看视频| 日韩欧美一区二区三区四区五区| 久久久久久国产精品免费无遮挡| 亚洲已满18点击进入久久| 欧美日韩在线视频一区二区三区| 国产一区二区主播在线| 日韩一级二级三级| 国产精品亚洲无码| 中文无码久久精品| 国产成人av网| 精品国产一级片| 久久久国际精品| 黄黄视频在线观看| 人人鲁人人莫人人爱精品| 欧美一级欧美三级在线观看 | 亚洲图片久久| 久久精品国产欧美亚洲人人爽| 日韩熟女精品一区二区三区| 美女视频黄频大全不卡视频在线播放| 成人自拍偷拍| av在线电影播放| 亚洲成人tv网| 亚洲18在线看污www麻豆| 日韩大片在线免费观看| 久久夜色撩人精品| 无码人妻精品一区二区三区9厂| 国产精品一卡二| 视频在线精品一区| 多野结衣av一区| 欧美一区二区在线视频| 久久亚洲无码视频| 在线综合欧美| 丁香婷婷久久久综合精品国产| h视频在线观看免费| 精品日韩视频在线观看| 男人操女人下面视频| 欧美丝袜激情| 55夜色66夜色国产精品视频| 精品毛片一区二区三区| 中文字幕一区视频| 国产视频一区二区三区在线播放 | 成人国产精品免费观看动漫| 国产日产亚洲精品| 天堂视频中文在线| 婷婷久久综合九色综合伊人色| 亚洲男人天堂2021| 51精品国产| 久久成人精品一区二区三区| 啪啪小视频网站| 26uuu成人网一区二区三区| 高清欧美精品xxxxx| 日本亚洲视频| 久久成人av网站| 国产熟女一区二区三区五月婷 | 久久香蕉精品视频| 国产麻豆精品视频| 日本女人高潮视频| 色成人综合网| 久久五月天色综合| 国产精品久久久久久免费播放| 国产精品免费视频观看| 国产成人黄色网址| 日本a级不卡| 国产精品中文在线| 亚洲1卡2卡3卡4卡乱码精品| 欧美图片一区二区三区| 一级片久久久久| 免费久久精品视频| 制服诱惑一区| 午夜视频一区二区在线观看| 九九热视频这里只有精品| 精品久久久久久亚洲综合网站 | 久久嫩草精品久久久精品| 少妇高潮喷水在线观看| 天海翼精品一区二区三区| 2020欧美日韩在线视频| 三级视频在线| 91久久久免费一区二区| 免费91在线观看| 国产在线播放一区三区四| 国产高清不卡无码视频| 国语一区二区三区| 日本韩国欧美精品大片卡二| av电影在线观看一区二区三区| 欧美日韩精品免费观看视频| 国模无码国产精品视频| 成人aa视频在线观看| 久久久久久久久久久免费视频| 日韩aaaa| 国产精品久久国产精品| 欧美性suv| 精品国产依人香蕉在线精品| 亚洲国产成人精品一区二区三区| 久久这里只有精品首页| 国产理论在线播放| 亚洲综合小说| 久久艳妇乳肉豪妇荡乳av| 国产极品一区| 欧美国产日产韩国视频| 毛片在线免费| 日韩一区二区三区电影 | 国产欧美综合一区二区三区| 日韩精品不卡| 99这里只有精品视频| 啪一啪鲁一鲁2019在线视频| 欧美亚洲专区| 好男人香蕉影院| 1000部精品久久久久久久久| 茄子视频成人在线观看| 九七电影院97理论片久久tvb| 久久亚洲精品成人| 欧洲综合视频| 日韩一级完整毛片| 青青国产在线视频| 一区二区成人在线| www久久久久久久| 国产成人免费在线| 校园春色 亚洲色图| 激情综合自拍| 中文字幕精品一区日韩| 外国成人在线视频| 91在线视频导航| 亚洲精品一级二级| 欧美黄色成人网| 午夜在线观看视频| 国产视频在线观看一区二区| 国产激情视频在线播放| 欧美三级日韩在线| 日韩免费黄色片| 亚洲欧美一区二区不卡| 日韩女同一区二区三区 | 欧美久久综合| 婷婷久久伊人| 亚洲激情77| 国产精品9999久久久久仙踪林 | 欧美日韩精品一区视频| 91国产丝袜播放在线| 亚洲激情图片小说视频| 可以免费看av的网址| 久久美女艺术照精彩视频福利播放| 欧美日韩一区二区区| 九九九久久久精品| 九热视频在线观看| 久久午夜影视| 国产在线青青草| 伊人成人在线视频| 国产 欧美 日本| 一区二区三区午夜探花| 在线观看福利一区| 日本精品三区| 亚洲欧美久久234| 国产一区二区三区站长工具| 精品国产一区二区三区麻豆免费观看完整版 | 色琪琪久久se色| 日韩一区国产在线观看| 国产最新精品| 日本一区二区精品| 精品国产91久久久久久浪潮蜜月| 免费国产在线精品一区二区三区| 欧美日韩精品一区二区三区在线观看| 成人高清在线观看| 伊人久久亚洲| 国产一区二区在线网站 | 韩国欧美国产1区| 中文字幕天天干| 久久99精品国产91久久来源| 在线观看免费av网址| 激情五月激情综合网| 性久久久久久久久久久久久久| 国产激情91久久精品导航| 97中文字幕在线观看| 成人污污视频在线观看| av免费观看不卡| 97久久人人超碰| 久久久久亚洲av成人无码电影| 久久精品免费在线观看| 国产在线综合视频| 国产精品另类一区| 黑人巨大精品一区二区在线| 亚洲线精品一区二区三区八戒| 国产无套粉嫩白浆内谢| 欧美午夜片欧美片在线观看| 日韩精品一区二区亚洲av| 欧美午夜宅男影院| www久久久久久| 日韩黄色在线免费观看| 春暖花开成人亚洲区| 久久影视电视剧免费网站| 国精产品一区一区三区mba下载| 国内精品久久久久伊人av| 国产精品专区免费| 成人欧美一区二区三区在线湿哒哒 | 国内精品久久久久国产盗摄免费观看完整版| 成人一级生活片| 亚洲欧美日韩专区| www.五月天色| 99久久精品国产观看| 午夜影院黄色片| 亚洲在线观看免费| 国产亚洲欧美日韩高清| 欧美一区二区三区思思人| 无码精品人妻一区二区| 中文字幕亚洲第一| 国产探花在线观看| 国产精品99久久久久久www| 麻豆精品一区| 美日韩精品免费| 欧美1区2区| 黄色一级免费大片| 成人一区在线观看| 超碰人人干人人| 五月天欧美精品| 国产三级漂亮女教师| 亚洲美女性生活视频| 污片在线免费观看| 国产99在线|中文| 影音先锋欧美激情| 在线精品亚洲一区二区| 媚黑女一区二区| 在线免费看黄色片| 中文字幕人成不卡一区| 国产精品一区无码| 日韩精品一区二区三区老鸭窝| 福利视频在线看| 国内偷自视频区视频综合| 亚洲人体在线| 欧美亚洲免费高清在线观看| 黄色成人av网站| 亚洲第一天堂久久| 亚洲国产精品二十页| 久久国产视频一区| 精品国产91亚洲一区二区三区婷婷 | 日韩精品一区二区三区中文在线| 亚洲v日韩v欧美v综合| 午夜在线精品偷拍| 精品一区二区三区四区五区六区| 亚洲色图丝袜美腿| 伊人成人在线观看| 一区二区三欧美| 乡村艳史在线观看| 国产99在线播放| 亚洲乱码免费伦视频| 欧美午夜性生活| 久久中文娱乐网| 国产性xxxx高清| 欧美成人猛片aaaaaaa| 麻豆影视在线观看_| 国产精品网红直播| 国产欧美一区二区精品久久久| 草b视频在线观看| 国产成a人亚洲| 久久久久久蜜桃| 精品国产亚洲在线| 韩国成人免费视频| 国产精品一区二| 一级成人国产| a天堂视频在线观看| 婷婷成人综合网| 亚洲人午夜射精精品日韩| 91精品国产高清久久久久久久久 | 国产福利视频一区二区三区| 亚洲xxxx3d动漫| 日韩一区二区在线免费观看| av网站大全在线| 亚洲xxxx视频| 韩国欧美一区| 亚洲国产精品无码久久久久高潮 | mm131国产精品| 国产精品久线观看视频| 亚洲在线免费观看视频| 久久久91精品国产| 视频成人永久免费视频| 日本xxxxxxxxxx75| 91丨九色丨尤物| 丰满人妻一区二区三区四区| 中文字幕日韩视频| 北岛玲精品视频在线观看| 九一免费在线观看| 国产91在线观看| 国产一级做a爱片久久毛片a| 亚洲深夜福利在线| 四虎精品在线观看| 欧美日韩激情四射| 91在线国内视频| 波多野结衣mp4| 精品国内亚洲在观看18黄 | 激情久久五月天| 久久久久久国产精品视频| 亚洲精品久久久一区二区三区| 国偷自产一区二区免费视频| 亚洲在线播放电影| 国产不卡视频在线播放| 黄色在线免费观看| 日韩视频中文字幕| 澳门成人av| 国产天堂在线播放| 亚洲男人电影天堂| 四虎在线免费看| 成人黄色av网| 一区二区日韩免费看| 欧美日韩国产黄色| 欧美成人激情免费网| 激情开心成人网| 久久综合亚洲精品| 久久久精品天堂| 国产黄色av网站| 欧美做爰性生交视频| 雨宫琴音一区二区三区| 午夜理伦三级做爰电影| 欧美成人一区二区三区片免费| 日韩精品一区二区三区| 美女黄色免费看| 中文字幕欧美日本乱码一线二线| 欧美熟妇交换久久久久久分类|