从头开始敲代码之《从BaseApplication/Activity开始(二)》
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
轉載請注明出處:王亟亟的大牛之路
愿意花時間寫東西不容易,人啊,都是有血有肉有思想的,借鑒是學習,純Copy就不好了,謝謝
部分資料參考于網(wǎng)上。
寸寸河山寸寸金,侉離分裂力誰任?
杜鵑再拜憂天淚,精衛(wèi)無窮填海心。
上一篇我們講到了簡易的封裝 對我們提高效率的好處,這一篇繼續(xù)寫下去,如果第一篇沒看過的希望能看下,方便理解。鏈接:亟亟在安卓的進階實例
這一次我們利用最基本的Activity生命周期中的方法,來對用戶藍牙進行識別操作,并在過程中考慮用戶層面的操作理解,順便補充下安卓手機的藍牙知識。
什么是藍牙?
一種無線技術標準,可實現(xiàn)固定設備、移動設備和樓宇個人域網(wǎng)之間的短距離數(shù)據(jù)交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。
白話:安卓對各個版本的藍牙其實都有一定的支持,從1.5的Cupcake就支持了藍牙耳機,但是自從安卓4.3版本之后Google對藍牙4.0的支持,又進一步的提升,所以對4.3前后的適配又成了我們的工作(現(xiàn)在已經(jīng)普遍以5.0為開發(fā)環(huán)境低版本的手機已經(jīng)不多,工作量其實已經(jīng)不大了)
OK,簡單介紹完了,開始今天的代碼
寫一個工具類BluetoothMgr,把藍牙一些相關的操作,放在里面
/**?*?Created?by?Ezreal?on?2015/9/14.?*/public?class?BluetoothMgr?{private?static?BluetoothMgr?oneInstance?=?null;public?static?BluetoothAdapter?mBluetoothAdapter?=?null;public?boolean?available?=?false;private?static?List<BluetoothDevice>?devList?=?new?ArrayList<BluetoothDevice>();private?BluetoothMgr()?{?}@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)private?BluetoothMgr(Context?context)?{int?sdkInt?=?Build.VERSION.SDK_INT;if?(sdkInt?<=?Build.VERSION_CODES.JELLY_BEAN_MR1)?{mBluetoothAdapter?=?BluetoothAdapter.getDefaultAdapter();}?else?{BluetoothManager?manager?=?(BluetoothManager)?context.getSystemService(Context.BLUETOOTH_SERVICE);mBluetoothAdapter?=?manager.getAdapter();}available?=?(null?!=?mBluetoothAdapter);}//判斷BluetoothMgr是否可用public?boolean?available()?{return?available;}//獲得實例public?static?BluetoothMgr?getInstance(Context?context)?{if?(null?==?oneInstance)?{oneInstance?=?new?BluetoothMgr(context);}return?oneInstance;}//搜索設備public?static?boolean?startDiscovery(){if?(null?==?mBluetoothAdapter)?{return?false;}if?(!mBluetoothAdapter.isEnabled())?{mBluetoothAdapter.enable();while?(!mBluetoothAdapter.isEnabled())?{try?{Thread.sleep(1000);}?catch?(InterruptedException?e)?{e.printStackTrace();}}}if?(mBluetoothAdapter.isDiscovering())?{return?true;}return?mBluetoothAdapter.startDiscovery();}//取消搜索public?static?boolean?cancelDiscovery()?{if?(mBluetoothAdapter?==?null)?{return?false;}if?(mBluetoothAdapter.isDiscovering()){return?mBluetoothAdapter.cancelDiscovery();}return?false;}//添加設備public?static?void?addOne(BluetoothDevice?device)?{if?(null?==?device)?{return;}if?(devList.contains(device))?{return;}devList.add(device);}//刪除設備public?static?void?deleteOne(String?mac)?{if?(null?==?mac?||?mac.length()==0)?{return;}for?(int?i?=?0;?i?<?devList.size();?++i)?{BluetoothDevice?device?=?devList.get(i);if?(device.getAddress().equalsIgnoreCase(mac))?{devList.remove(i);break;}}}//清空集合public?static?void?clearAllDevices()?{devList.clear();}public?static?BluetoothDevice?findOne(int?pos)?{if?(pos?<?0?||?pos?>=?devList.size())?{return?null;}return?devList.get(pos);}public?static?List<BluetoothDevice>?getDevList()?{return?devList;}public?static?boolean?isDevListEmpty()?{return?(null?==?devList?||?devList.isEmpty());}//獲取狀態(tài)public?static?int?getState(){if(mBluetoothAdapter!=null){LogUtils.d("BluetoothMgr","mBluetoothAdapter.getState()"+mBluetoothAdapter.getState());return?mBluetoothAdapter.getState();}else{return?-1;}} }分析:對藍牙的一些基本方法進行了封裝,以及版本的判斷,這邊在例舉下藍牙相關的一些具體代碼的內(nèi)容
(這部分網(wǎng)上資料還算有,也可以找找)
在安卓要使用藍牙,先要授權
????<uses-permission?android:name="android.permission.BLUETOOTH"?/><uses-permission?android:name="android.permission.BLUETOOTH_ADMIN"?/>不然你項目一運行就是異常。
要使用藍牙必須聲明一個BluetoothAdapter
在4.3之前
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();獲取系統(tǒng)默認藍牙。
4.3之后
BluetoothManager manager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = manager.getAdapter();
列舉一些常用的方法
disable()關閉藍牙
enable()打開藍牙(用戶將不會收到提示)
下面是另一種打開藍牙的方式,但是會提醒用戶手動去打開
Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);
cancelDiscovery() 取消搜索設備
startDiscovery() 開始搜索設備
getAddress()獲取本地藍牙地址
getName()獲取本地藍牙名稱
getRemoteDevice(Stringaddress)根據(jù)藍牙地址獲取遠程藍牙設備
getState()獲取本地藍牙適配器當前狀態(tài)
isDiscovering()判斷當前是否正在查找設備,是返回true
isEnabled()判斷藍牙是否打開,已打開返回true,否則,返回false
再列舉下藍牙的狀態(tài)值
BluetoothAdapter STATE 狀態(tài)值
BluetoothAdapter SCAN_MOD狀態(tài)值=掃描狀態(tài)
可以掃描其他設備的,當然它同時能被其他藍牙設備掃碼。
?????int??SCAN_MODE_CONNECTABLE?????????表明該藍牙可以掃描其他藍牙設備int??SCAN_MODE_CONNECTABLE_DISCOVERABLE?????可以掃描其他藍牙設備,并且可以被其他藍牙設備掃描到。int??SCAN_MODE_NONE?:?該藍牙不能掃描以及被掃描。更多資料可參考BluetoothAdapter[藍牙]
鋪墊做的差不多了,我們開始今天的代碼。
需求:我有一個Activity,我需要進入他的時候讓用戶開啟手機藍牙,然后對我們的另外一個藍牙硬件進行操作,如果用戶不愿意去開,那就停留在原有界面,如果用戶去開藍牙了并且成功了那么就進入下一步操作,如果沒開成功,那么繼續(xù)提示。
包結構:
代碼的基類都是在我們之前的Demo中繼續(xù)添加的,更有延續(xù)性。
直接貼 MainActivity
public?class?MainActivity?extends?BaseActivity?implements?View.OnClickListener{Button?button;private?MyPromptDlg?btNotOpenDlg?=?null;BluetoothMgr?bleMgr;@Overrideprotected?void?findById()?{button=(Button)findViewById(R.id.button);bleMgr=BluetoothMgr.getInstance(this);}@Overrideprotected?void?setListener()?{button.setOnClickListener(this);}@Overrideprotected?void?logic()?{}@Overrideprotected?int?getLayout()?{return?R.layout.activity_main;}@Overridepublic?void?onClick(View?v)?{if?(v.getId()==R.id.button){Toast.makeText(MainActivity.this,"NFC是否可用???"+NFCisAvailable(),Toast.LENGTH_SHORT).show();openBlueToothSetting();}}@Overrideprotected?void?onResume()?{super.onResume();LogUtils.d("------>onResume");if(bleMgr.isEnabled()){Toast.makeText(MainActivity.this,"藍牙已經(jīng)打開",Toast.LENGTH_SHORT).show();}else{OpenBlueTooth();}}//打開藍牙private?void?OpenBlueTooth(){//判斷Activity的狀態(tài)if?(this.isFinishing())?{return;}if?(null?==?btNotOpenDlg)?{MyPromptDlg.Builder?builder?=?new?MyPromptDlg.Builder(this);builder.setTitle(res.getString(R.string.prompt_dlg_title)).setText(res.getString(R.string.bt_check_message)).setPositiveButton(res.getString(R.string.common_ok),new?DialogInterface.OnClickListener()?{@Overridepublic?void?onClick(DialogInterface?dialog,int?which)?{dialog.dismiss();openBlueToothSetting();}}).setNegativeButton(res.getString(R.string.common_cancel),new?DialogInterface.OnClickListener()?{@Overridepublic?void?onClick(DialogInterface?dialog,int?which)?{dialog.dismiss();//finish();}});btNotOpenDlg?=?builder.create();btNotOpenDlg.setCancelable(false);btNotOpenDlg.setCanceledOnTouchOutside(false);}if?(!btNotOpenDlg.isShowing())?{btNotOpenDlg.show();}}//打開系統(tǒng)藍牙設置菜單private?void?openBlueToothSetting(){Intent?intent?=?new?Intent(Settings.ACTION_BLUETOOTH_SETTINGS);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);} }分析:
首先我們在我們的onCreate方法中初始化一個BluetoothMgr并且讓其獲得了系統(tǒng)藍牙的實例(包中的BluetoothMgr是一個Demo版的,具體更多的通用方法封裝在JAR包中了)
用戶進入App 依次調(diào)用onCreate–onStart–onResume–Activity進入運行狀態(tài)。
我們在onCreate時并沒有對用戶的藍牙狀態(tài)進行判斷,而是在onResume方法中判斷,這是為什么?看下圖
因為onResume會多次調(diào)用,而onCreate在不被回收過或者onStop的情況下永遠就調(diào)用一次,我們需要每一次用戶焦點在我們App中的時候都去判斷藍牙的狀態(tài),那就是為什么我們要這么做的原因。
為了提高我們App的友好度,在判斷用戶沒有開啟藍牙的時候,我們彈出一個Dialog提示用戶要不要去開藍牙,如圖
如果用戶點擊取消我們會回到界面,但是不會調(diào)用onResume方法,不然我們的用戶 就一直在那里選啊選了,不符合邏輯。
點擊是,調(diào)用openBlueToothSetting()方法去手動開啟,當然如果你覺得你需要強勢一些可以用enable()方法,直接就開啟了,但是要記得做短暫的等待,因為開啟藍牙會有一定的異步操作。
因為你代碼調(diào)用開啟藍牙所以用戶回到界面之后不會再判斷時候開啟藍牙,也符合我們的業(yè)務需求。
當用戶點擊確定的時候我們開啟了藍牙設置菜單界面(系統(tǒng)的)
回來之后又調(diào)用了onResume,彈出了我們的吐司
OK我們的業(yè)務就完成了,還有別的實現(xiàn)方法么?有!!
可以用Service,開一個現(xiàn)成一直在那里判斷也能達到效果 但是不是最理想的實現(xiàn)方式
還有是BroadcastReceiver 去監(jiān)聽手機藍牙的變化,實現(xiàn)如下
BroadcastReceiver?bluetoothState?=?new?BroadcastReceiver()?{public?void?onReceive(Context?context,?Intent?intent)?{String?stateExtra?=?BluetoothAdapter.EXTRA_STATE;???????int?state?=?intent.getIntExtra(stateExtra,?-1);???????switch(state)?{case?BluetoothAdapter.STATE_TURNING_ON:break;case?BluetoothAdapter.STATE_ON:break;case?BluetoothAdapter.STATE_TURNING_OFF:break;case?BluetoothAdapter.STATE_OFF:break;}} }registerReceiver(bluetoothState,new?IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));記得注銷哦!!
午休午休!!源碼地址:http://yunpan.cn/cmCaaRkzc2UV6 訪問密碼 4894
版權聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉載。
轉載于:https://my.oschina.net/ddwhan0123/blog/506800
總結
以上是生活随笔為你收集整理的从头开始敲代码之《从BaseApplication/Activity开始(二)》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 婚礼赠言语录精选7170个
- 下一篇: 水果店名大全寓意兴旺287个