IT虾米网

Android蓝牙开发经验总结(一)

duanxz 2022年11月07日 手机开发 131 0
转载请注明博客地址`http://blog.csdn.net/q1406689423/article/details/50331889`,谢谢! 

一直以为在CSDN上面写日志的都是一些大牛,而且也觉得写博客是一种很好的学习总结的方法,但是也是由于自己没什么时间,也是觉得自己水平不够,没有什么可写的。但是还是有一个成为大牛的心,所以还是决定开始写日志。同时也算给别说一下自己解决问题的方法,另外 以后再做这一块也是一个参考。

这份工作应该算是我第一份从事编程的工作,刚开始来的时候以为是做Android前端的UI,自己本身对UI开发还算比较感兴趣,所以就悻悻地来了。来了才知道我们这公司是一个游戏公司,我需要做的不是UI方面,而是做蓝牙通信这一块,以前也没做过这一块,但是觉得应该不会太难,应该会有系统给提供的一些接口,直接调用就可以了。但是确实是自己想简单了,算上处理bug用了大半个月的时间了,而且本来建议是采用蓝牙4.0的开发的,但是老板说为了让覆盖的人群更广就没选,不懂技术的老板伤不起啊!在这就是想把经验向大家分享一下,希望可以帮到有需要的人。
不说废话了,开始进入正题!

首先说一下蓝牙开发的准备阶段,主要就是在网上找类似的源码,本来以为蓝牙的源码应该也是不少的,但是找了一下却并不像自己想的那样,而且看着是符合自己需求的那种,点开发现却是要有积分之类的,其实挺坑的。找了很久之后,最后在一个论坛里发现一个人给的地址,是github上的一个源码,点开之后是直接可以聊天的那种,正好符合自己的需求。看了看github上的介绍,才发现原来是AndroidSDK上面原生的例子,感觉自己走了很多弯路啊!在此推荐给有意于蓝牙开发的同学一个提醒!

Github上的下载地址:https://github.com/ALLENnan/BluetoothChat

应该是这个网址,以前的没记下,写这篇日志的时候又在上面找了一下,应该是这个!

但是这里面的结构不是很清晰,而且是把三个连接状态下的线程都写在一个Service服务类,我自己感觉这样写是不怎么好的,一是结构不太清晰,二来感觉也不太容易维护,所以就进行了一些拆分。
首先来看一下主类BluetoothChat的作用:

 @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        if(D) Log.e(TAG, "+++ ON CREATE +++"); 
        // Set up the window layout 
        setContentView(R.layout.main); 
        // Get local Bluetooth adapter 
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
        // If the adapter is null, then Bluetooth is not supported 
        if (mBluetoothAdapter == null) { 
            Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show(); 
            finish(); 
            return; 
        } 
    } 

在Oncreate方法里面获得了一个BluetoothAdapter的对象,这个对象很重要,是实现蓝牙各种功能的基础,至于用法什么大家可以查看官方API进行了解,后面也会用到。需要注意的是Android api18以上获得BluetoothAdapter对象的方法不同了,大家可以查阅官方文档,这里不再赘述。

 @Override 
    public void onStart() { 
        super.onStart(); 
        if(D) Log.e(TAG, "++ ON START ++" ); 
 
        // If BT is not on, request that it be enabled. 
        // setupChat() will then be called during onActivityResult 
        if (!mBluetoothAdapter.isEnabled()) { 
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT); 
 
        // Otherwise, setup the chat session 
        } else { 
            if (mChatService == null) setupChat(); 
        } 
    } 

我们看到,在onstart方法里面进行了打开蓝牙的操作,其实直接调用mBluetoothAdapter的enable()方法也可以实现这样的效果!

@Override 
    public synchronized void onResume() { 
        super.onResume(); 
        if(D) Log.e(TAG, "+ ON RESUME +"); 
 
        // Performing this check in onResume() covers the case in which BT was 
        // not enabled during onStart(), so we were paused to enable it... 
        // onResume() will be called when ACTION_REQUEST_ENABLE activity returns. 
        if (mChatService != null) { 
            // Only if the state is STATE_NONE, do we know that we haven't started already 
            if (mChatService.getState() == BluetoothChatService.STATE_NONE) { 
              // Start the Bluetooth chat services 
              mChatService.start(); 
            } 
        } 
    } 

在onResume方法里面我们就可以看到源码mChatService开始启动了,但是我改动之后的是将服务分为了两个线程,也是因为我们的项目的需要,就是拆分为一个用来主动连接的线程、一个用来接收的线程。
先写到这了,明天继续哈~


本文参考链接:https://blog.csdn.net/q1406689423/article/details/50331889
评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java多线程中Lock锁如何使用