❶ android開發之藍牙(Bluetooth)
在上一篇中有介紹了Wifi與網路連接處理
Android開發之WiFi與網路連接處理
下面,來繼續說說Android中藍牙的基本使用。
Bluetooth是目前使用的最廣泛的無線通訊協議之一,主要針對短距離設備通訊(10米),常用於連接耳機、滑鼠和移動通訊設備等。
值得一提的是:
android4.2新增了部分新功能,但是對於Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協議棧針BLE。谷歌和Broadcom之間的合作,開發新的藍牙協議棧,取代了基於堆棧的Bluez。因此市場上出現了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。
BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。
first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入許可權
**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:
返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。
打開藍牙設備的方式:
1.直接調用函數enable()去打開藍牙設備 ;
2.系統API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。
注意: 1.如果藍牙已經開啟,不會彈出該Activity界面。2.在目前大多數Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經開啟,那麼藍牙的開關 ,狀態會隨著飛行模式的狀態而發生改變。
1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個非同步方法,調用後會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用後,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。
系統開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統會發送以下三個廣播:
2.掃描設備
3.定義廣播接收器接收搜索結果
4.注冊廣播
獲取附近的藍牙設備
第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以伺服器端和客戶端都應啟動新線程連接。
(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。
服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。
服務端
通過調用BluetoothAdapter的(String, UUID)方法來獲取BluetoothServerSocket(UUID用於客戶端與服務端之間的配對)
客戶端
調用BluetoothService的(UUID)方法獲取BluetoothSocket(該UUID應該同於服務端的UUID)。
調用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,並且連接被服務端accept,則connect()方法返回。
數據傳遞,通過以上操作,就已經建立的BluetoothSocket連接了,數據傳遞無非是通過流的形式
獲取流
該類就是關於遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。
好多東西我也不知道怎麼描述,下面給出Demo:
剛好有剛學習的小夥伴問我ListView怎麼用,那我就用ListView。
源碼:
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git
❷ android的adapter能不能在onResume方法中創建
Adapter是連接後端數據和前端顯示的適配器介面,是數據和UI(View)之間一個重要的紐帶。在常見的View(ListView,GridView)等地方都需要用到Adapter。
1.如下圖直觀的表達了Data、Adapter、View三者的關系:
由圖可以看到在Android中與Adapter有關的所有介面、類的完整層級圖。在我們使用過程中可以根據自己的需求實現介面或者繼承類進行一定的擴展。比較常用的有BaseAdapter,Impleader,Adapter,Counteradaptation等。
BaseAdapter是一個抽象類,繼承它需要實現較多的方法,所以也就具有較高的靈活性;
ArrayAdapter支持泛型操作,最為簡單,只能展示一行字。
SimpleAdapter有最好的擴充性,可以自定義出各種效果。
SimpleCursorAdapter可以適用於簡單的純文字型ListView,它需要Cursor的欄位和UI的id對應起來。如需要實現更復雜的UI也可以重寫其他方法。可以認為是SimpleAdapter對資料庫的簡單結合,可以方便地把資料庫的內容以列表的形式展示出來。
2.Adapter的方法
1.下面將對Adapter代碼,做詳細的解釋,listView在開始繪制的時候,系統首先調用getCount()函數,根據他的返回值得到listView的長度,然後根據這個長度,調用getView()逐一繪制每一行。如果你的getCount()返回值是0的話,列表將不顯示同樣return 1,就只顯示一行。
2.系統顯示列表時,首先實例化一個適配器(這里將實例化自定義的適配器)。當手動完成適配時,必須手動映射數據,這需要重寫getView()方法。系統在繪制列表的每一行的時候將調用此方法。getView()有三個參數,position表示將顯示的是第幾行,covertView是從布局文件中inflate來的布局。
當了解了Adapter是怎麼工作以後,你會發現Adapter的創建其實與Activity的生命周期無關
也就是說,你在onResume 創建和刷新都是沒有問題的,當你調用adapter.notifyDataSetChanged() 方法後,android系統會刷新一下列表,實際上就是重新調用了一次adapter的 getView() ,即重新繪制每一行數據
有關adapter的機制,及更多用法,建議查看官方API文檔
❸ Android涔嬩笅鎷夋嗛夋嫨浣跨敤紺轟緥
鍦ˋndroid寮鍙戜腑錛屽壋寤轟竴涓鐩磋備笖鍔熻兘涓板瘜鐨勪笅鎷夋嗭紙Spinner錛夋槸鑷沖叧閲嶈佺殑銆傝╂垜浠閫愭ユ帰緔㈠備綍鍦╔ML甯冨矓鍜孞ava浠g爜涓瀹炵幇榪欎釜鍔熻兘錛屼互鍙婂備綍鐩戝惉閫変腑欏瑰拰鑷瀹氫箟閫傞厤鍣ㄤ互婊¤凍澶嶆潅闇奼傘
棣栧厛錛岃╂垜浠鍦╔ML甯冨矓鏂囦歡涓瀹氫箟Spinner鍜屼竴涓鍩虹鐨勯傞厤鍣ㄣ傚湪<Spinner>鍏冪礌涓錛岃劇疆鍏跺藉害鍜岄珮搴︿負鑷閫傚簲錛
```xml
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
```
鎺ヤ笅鏉ワ紝鐢↗ava浠g爜鏉ュ炲己榪欎釜緇勪歡銆傚湪浣犵殑Activity鎴朏ragment涓錛岄氳繃findViewById()鑾峰彇Spinner瀹炰緥錛岀劧鍚庤劇疆涓涓獮rrayAdapter錛屼嬌鐢ˋrrayAdapter鐨勬瀯閫犲嚱鏁頒紶鍏ヤ笂涓嬫枃銆佸竷灞璧勬簮鍜屾暟鎹錛
```java
import ... ArrayAdapter;
ArrayAdapter spinnerAdapter;
List data = Arrays.asList("閫夐」1", "閫夐」2", "閫夐」3");
spinner = findViewById(R.id.spinner);
spinnerAdapter = new ArrayAdapter>(this, android.R.layout.simple_spinner_item, data);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerAdapter);
```
紜淇濅綘鐨勯傞厤鍣ㄨ兘澶熸樉紺哄氭牱鍖栫殑鏁版嵁鍜岃嚜瀹氫箟甯冨矓錛岃繖鏍蜂綘鍙浠ユ牴鎹闇瑕佽皟鏁翠笅鎷夋嗙殑澶栬傘
褰撲綘甯屾湜鐢ㄦ埛鍦ㄤ笅鎷夋嗕腑榪涜岄夋嫨鏃訛紝闇瑕佷負Spinner璁劇疆涓涓鐩戝惉鍣ㄣ傚湪onCreate()鏂規硶涓錛屽疄鐜癘nItemSelectedListener鎺ュ彛錛屼互鍝嶅簲閫変腑欏圭殑鏀瑰彉錛
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
String selectedValue = spinnerAdapter.getItem(position);
Toast.makeText(MainActivity.this, "閫夋嫨鐨勫: " + selectedValue, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView parent) {
// 鏃犻変腑欏瑰勭悊
}
});
}
```
瑕佷富鍔ㄨ幏鍙栭変腑鐨勫礆紝浣犲彲浠ョ洿鎺ヨ皟鐢╯pinner.getSelectedItem()鑾峰彇鏂囨湰錛屾垨鑰呬嬌鐢╯pinner.getSelectedItemPosition()鑾峰彇浣嶇疆銆傚姟蹇呭勭悊鏃犻変腑欏圭殑杈圭紭鎯呭喌錛
```java
int currentPosition = spinner.getSelectedItemPosition();
String selectedItem = (currentPosition != AdapterView.INVALID_POSITION) ? spinner.getSelectedItem() : null;
```
涓轟簡鍒濆嬪寲榛樿ら変腑欏癸紝浣犲彲浠ヨ劇疆setSelection()錛屾瘮濡傚皢絎浜屼釜閫夐」璁劇疆涓洪粯璁わ細
```java
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
spinner.setSelection(1);
}
});
```
榪欐牱錛屼綘涓嶄粎鍒涘緩浜嗕竴涓鍩烘湰鐨勪笅鎷夋嗭紝榪樻坊鍔犱簡鐢ㄦ埛浜や簰鍜岄変腑欏圭殑鐩戝惉銆傝嚜瀹氫箟閫傞厤鍣ㄥ厑璁鎬綘鏍規嵁闇瑕佸睍紺哄嶆潅鏁版嵁錛岃岀洃鍚鍣ㄥ垯紜淇濅簡閫夋嫨浜嬩歡鐨勫勭悊銆傚湪瀹為檯欏圭洰涓錛岃板緱鏍規嵁搴旂敤闇奼傚瑰竷灞銆佹牱寮忓拰鏁版嵁榪涜岃皟鏁達紝浠ユ彁鍗囩敤鎴蜂綋楠屻
❹ Android 開發中常用到的設計模式有哪些
Builder模式:比如AlertDialog.Builder。
適配器模式:比如GridView、ListView與Adapter。
命令模式:比如Handler.post。
享元模式:比如Message.obtain。
單例模式:比如InputMethodManager.getInstance。
觀察者模式:比如ContentObserver。
這是一些經常用到的設計模式以及舉例。
❺ Android:安卓下的這三個適配器有什麼區別CursorAdapter\ResourceAdapter\SimpleCursorAdapter
三個適配器都是BaseAdapter的子類,用於ListView展示數據用的。
CursorAdapter繼承於BaseAdapter,它是個虛類,它為cursor和ListView提供了連接的橋梁。它的數據是與Cursor綁定的。它提供兩個抽象函數newView和bindView給派生類特製化:newView生成自定 義的View,bindView為自定義View綁定數據。所以我們繼承CursorAdapter時,只需要實現這兩個函數即可。
ResourceCursorAdapter 繼承於CursorAdapter,它包含LayoutInflater對象,可以把xml轉化成view。成員函數newView和 newDropDownView,根據構造函數初始化時傳入或是setViewResource設置的資源id,產生對應的view並返回。
SimpleCursorAdapter繼承於CursorAdapter,通過游標訪問資料庫。