❶ 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,通过游标访问数据库。