代码流程分析二:Settings-蓝牙分析-新增rawgelWhile分析一
来源:互联网 发布:淘宝冻结账号解冻中心 编辑:程序博客网 时间:2024/05/22 03:36
<span style="font-family: Arial, Helvetica, sans-serif;">一:进来Settings之后因为是shardprefrence的控件每一个是一个fragment所以它没有把点击事件写在蓝牙界面而写在了主界面上,进入蓝牙界面会点击左软件,进入一个新的界面流程是:</span>
public boolean dispatchKeyEvent(KeyEvent event) {// TODO Auto-generated method stubif((select == 3)&&(event.getKeyCode() == 1)&&(BluetoothSettings.bluetooth_key_lsk)&&((mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON))){Intent iintent = new Intent("settings.bluetooth.RadgerWheelActivity");startActivity(iintent);return true;}if(event.getKeyCode() == 1){return true;}return super.dispatchKeyEvent(event);}
二:分析RadgerWheelActivity,也就是这个新的界面
直接定位OnCreate( )方法setContentView(R.layout.main);
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ><LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/linearLayout" android:visibility="gone"><TextView android:id="@+id/conncet" android:layout_width="match_parent" android:layout_height="35sp" android:layout_margin="6sp"android:textSize="20sp"/><TextView android:id="@+id/conncet_address" android:layout_width="match_parent" android:layout_height="35sp" android:layout_margin="6sp"android:textSize="15sp"/></LinearLayout><ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/list"></ListView></LinearLayout>
就是说有2个布局第一个布局是2个TextView,下面的布局是一个listView,而且第一个是隐藏的显示不可见的。
VISIBLE:0 意思是可见的
INVISIBILITY:4 意思是不可见的,但还占着原来的空间
GONE:8 意思是不可见的,不占用原来的布局空间</p>
getActionBar().setTitle(R.string.title_devices);------------------------------------------------------最上面的导航条上设置内容为BLE Device Scan mHandler = new Handler();----------------------------------------------------------------------一个handler对象mListView = (ListView)findViewById(R.id.list);-----------------------------------------实例化listView对象conncet = (TextView)findViewById(R.id.conncet);----------------------------------------实例化第一个TextView的connectlinearLayout = (LinearLayout)findViewById(R.id.linearLayout);--------------------------实例化隐藏的linearLayoutconncet_address = (TextView)findViewById(R.id.conncet_address);------------------------实例化第二个TextView的connect_addresssharedpreferences=getSharedPreferences(saveInfo, MODE);------------------------->SharedPreferences是以键值对来存储应用程序的配置信息的一种方式,它只能存储基本数据类型。一个程序的配置文件仅可以在本应用程序中使用,或者说只能在同一个包内使用,不能在不同的包之间使用。 实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。为本组件的配置文件名(如果想要与本应用程序的其他组件共享此配置文件,可以用这个名字来检索到这个配置文件)。如果要读取配置文件信息,只需要直接使用SharedPreferences对象的getXXX()方法即可,而如果要写入配置信息,则必须先调用SharedPreferences对象的edit()方法,使其处于可编辑状态,然后再调用putXXX()方法写入配置信息,最后调用commit()方法提交更改后的配置文件。为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。</p>editor=sharedpreferences.edit();linearLayout.setFocusable(true);linearLayout.setBackgroundResource(R.drawable.item_background);
<span style="font-family: Arial, Helvetica, sans-serif;">---------------------------------------------------------------------------------------------------------------------------------------------------------MODE=0是默认的,name=saveInfo</span></span>这个是隐藏的linearLayout
linearLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
---------------------------------------------------------------------------------------------------------------------------------mScanning默认是false,但这个条件是true的时候才执行
if (mScanning) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);---------------------------------------------------------应该是停止扫描设备(里面传的值是?)
mScanning = false;
}
//mmHandler_delayed.sendEmptyMessageDelayed(0,2000);
//final Intent iintent = new Intent(RadgerWheelActivity.this,BluetoothCODAService.class);
//stopService(iintent);
final Intent iintent = new Intent("BluetoothDisconnect");
sendBroadcast(iintent);
---------------------------------------------------------------------------------------------------------------------------------点击的时候发送一个广播
editor.putString("RadgerWheel_Connect_Address", "null");
editor.putString("RadgerWheel_Connect_Address_old", "null");
editor.commit();
mListView.setEnabled(true);
--------------------------------------------------------------------------------------------------------------------------------保存值,listView设置可以编辑状态
final Intent mintent = new Intent("com.android.intent.action.bluetooth.state");
mintent.putExtra("state", 1);
sendBroadcast(mintent);
--------------------------------------------------------------------------------------------------------------------------------再次发送一个广播
}
});
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { //Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); }-------------------------------------------------------------------------------------------------------------------------------------------------------------------- final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter();---------------------------------------------------------------------------------------------------------------------------------------------------------------------通过服务拿到manager对象,通过manager对象拿到blutetoothAdapter对象 // Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { //Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show(); finish(); return; }
<span style="font-family: Arial, Helvetica, sans-serif;">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------是空就finish</span></span>
mListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View v, int count, long arg3) { final BluetoothDevice device = mLeDeviceListAdapter.getDevice((int)arg3);if (device == null) return;if (mScanning) { mBluetoothAdapter.stopLeScan(mLeScanCallback);mScanning = false;invalidateOptionsMenu();}String address=sharedpreferences.getString("RadgerWheel_Connect_Address","null");if(!(address.equals("null"))){return;}mListView.setEnabled(false);conncet_address.setEnabled(false);//mHandler_delayed.sendEmptyMessageDelayed(0,2000);//TextView text = (TextView)v.findViewById(R.id.tv2);//editor.putString("RadgerWheel_Connect_Address", mBluetoothDevice.getAddress());//editor.putString("RadgerWheel_Connect_Address_old", device.getAddress());//editor.commit();//final Intent iintent = new Intent(RadgerWheelActivity.this,BluetoothCODAService.class);final Intent iintent = new Intent("BluetoothConnect");Bundle bundle = new Bundle();bundle.putParcelable("BlutoothDevice", device);iintent.putExtras(bundle);sendBroadcast(iintent);//text.setText(R.string.connected);mLeDeviceListAdapter.deleteDevice(device);mLeDeviceListAdapter.notifyDataSetChanged();linearLayout.setVisibility(0);conncet.setText(device.getAddress());conncet_address.setText(R.string.connected); } }); }
总结:设置最上面标题,实例化每一个控件,获取键值,给隐藏的linearLayout设置点击事件,拿到blutetoothAdapter对象,给listView设置点击事件,因为点击事件是onresume()里面实例化了再点击也行不用非得在oncreate中实例化
三:定位到onResume()方法中</span>
protected void onResume() { super.onResume(); // Ensures Bluetooth is enabled on the device. If Bluetooth is not currently enabled, // fire an intent to display a dialog asking the user to grant permission to enable it. if (!mBluetoothAdapter.isEnabled()) { if (!mBluetoothAdapter.isEnabled()) { //Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); //startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); finish(); } } // Initializes list view adapter. mLeDeviceListAdapter = new LeDeviceListAdapter();--------------------------------------------------------------------设置适配器 mListView.setAdapter(mLeDeviceListAdapter);--------------------------------------------------------------------------mac_address=sharedpreferences.getString("RadgerWheel_Connect_Address","null"); scanLeDevice(true);Handler_delayed.sendEmptyMessage(0); }
private void scanLeDevice(final boolean enable) { if (enable) { // Stops scanning after a pre-defined scan period. mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); invalidateOptionsMenu(); } }, SCAN_PERIOD); mScanning = true;final Intent iintent = new Intent("BluetoothScan");sendBroadcast(iintent); mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } invalidateOptionsMenu();
四:现在分析一下原理流程:
--进来进入OnResume()然后走一遍流程
--1:if (!mBluetoothAdapter.isEnabled()) 蓝牙适配器是不可编辑的时候finish();
--2:否则的话:
-------mLeDeviceListAdapter = new LeDeviceListAdapter();
mListView.setAdapter(mLeDeviceListAdapter);给listView设置适配器---------------------------------一会分析适配器的内容
---3:scanLeDevice(true);扫描那个设备
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
Log.d("lwn","zhaohaiyun stop scan 1....");
mBluetoothAdapter.stopLeScan(mLeScanCallback);
invalidateOptionsMenu();
}
}, SCAN_PERIOD);
//handler.postDelayed(runnable, 2000);就是一个定时的功能这个的意思是2秒定时后执行runnable,--------------------------------------------------------------------------这个的功能就是一进来走下面的发送广播,查询那个设备,一会分析那个设备。10秒之后走runnable方法就是停止查询这个设备
mScanning = true;
Log.d("lwn","zhaohaiyun start scan....");
final Intent iintent = new Intent("BluetoothScan");
sendBroadcast(iintent);
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
Log.d(TAG,"zhaohaiyun stop scan 2....");
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
invalidateOptionsMenu();
--------------------------------------------------------------------------------------------------------------------------------------
----4:Handler_delayed.sendEmptyMessage(0);发送一个消息,没有延迟的发送0是这个消息的ID,其实是循环来更新1秒的时间循环来
private Handler Handler_delayed = new Handler() {
@Override
public void handleMessage(Message msg) {
mac_address=sharedpreferences.getString("RadgerWheel_Connect_Address","null");
if(!(mac_address.equals("null"))){
linearLayout.setVisibility(0);//显示这个布局
conncet.setText(mac_address);
conncet_address.setText(R.string.connected);
}else{
linearLayout.setVisibility(8);//这个布局隐藏了
mListView.setEnabled(true);
}
sendEmptyMessageDelayed(0,1000);//给自己延迟1秒来发送消息-----------------------------
}
};
---总结-综合下来就是一进入resume()方法:给listView设置适配器,然后扫描那个设备,10秒的时间,先走发送广播,这个广播就是重点,蓝牙适配器来查询mLeScanCallback这个设备,10秒之后就停止查询。然后就是每1秒给自己发送消息一次(用来处理listView可编辑,或设置Text)
- 代码流程分析二:Settings-蓝牙分析-新增rawgelWhile分析一
- 代码流程分析二:Settings-蓝牙分析-新增rawgelWhile分析二
- 代码流程分析二:Settings-蓝牙分析-switch开关分析
- 代码流程分析二:Settings-蓝牙分析-加载界面
- 代码流程分析二:Settings-蓝牙分析-搜索设备原理
- 代码流程分析二:Settings-蓝牙分析-myDevice根preference分析
- 代码流程分析二:Settings-蓝牙分析-点击配对连接设备原理分析
- 代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕
- Android Settings源码流程分析
- Settings模块分析(二)
- Settings模块分析(一)
- Settings分析
- BlueDroid 蓝牙启动流程分析
- 蓝牙开启流程(enable)分析
- 新增代码关联Sonar分析学习笔记一
- linux_蓝牙驱动代码分析
- 蓝牙代码基本结构分析
- skynet流程分析二
- Apple Watch开发(三)--WatchKit简介和Watch适配、布局
- leetcode || 122、Best Time to Buy and Sell Stock II
- 【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存
- Android中Cannot draw recycled bitmaps
- java.io.IOException: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode =
- 代码流程分析二:Settings-蓝牙分析-新增rawgelWhile分析一
- 在WINDOWS中设置计划任务执行PHP文件
- C和指针读书笔记-第12章(使用结构和指针)
- spark:仿写案例--30
- 实用算法的分析与程序设计——递推法(倒推法)
- vector.....
- zookeeper监控工具node-zk-zookeeper安装
- [BZOJ 1407][NOI 2002]Savage(中国剩余定理+扩展欧几里得)
- SAP 物料分类账常用表