当前位置: 首页 > 知识库问答 >
问题:

Android后台蓝牙处理:最好的方法是什么?

濮献
2023-03-14

我刚刚开发了一个Android应用程序(MINSDKVersion23/TargetSDKVersion29),它可以连接到BluetoothLE设备以定期获取数据。

现在,在MainActivity(不是第一个活动)中,我执行以下注册BroadcastReciever的操作:

public class StatusActivity extends AppCompatActivity {    
    BleService mBleService;
    BleScanCallback mScanCallback;
    BroadcastReceiver mBroadcastReceiver;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mBroadcastReceiver = new LibBleBroadcastReceiver(this);
        IntentFilter intentFilter = new IntentFilter()    
        intentFilter.addAction(BleService.ACTION_GATT_CONNECTED);
        intentFilter.addAction(BleService.ACTION_GATT_DISCONNECTED);
        intentFilter.addAction(BleService.ACTION_GATT_SERVICES_DISCOVERED);
        intentFilter.addAction(BleService.ACTION_DATA_AVAILABLE);
        intentFilter.addAction(BleService.ACTION_DID_WRITE_CHARACTERISTIC);
        intentFilter.addAction(BleService.ACTION_DID_FAIL);
        registerReceiver(mBroadcastReceiver, intentFilter);
    
        mScanCallback = new LibBleScanCallback(this);
        intent = new Intent(this, BleService.class);
        connection = new LibBleServiceConnection(this);
    
        startService(intent);
        if (!bindService(intent, connection, Context.BIND_AUTO_CREATE)) {
            throw new IllegalStateException("bindService not successful");
        }
    }
    ...
    public void onDeviceDiscovered(String device_address){
        device_connected.activateNotifications(mBleService, connected_device);
        scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
            public void run() {
                device_connected.requestTemperature(mBleService, connected_device);
            }
        }, 0, 30, TimeUnit.MINUTES);
    }
    ...
}
<service android:name=".bluetooth.BleService" android:enabled="true" />

当设备连接/发现/datareCieved时执行的所有回调都在StatusActivity中,而不是在BleService(意图)中,以便在UI中进行更改(尽管在后台没有必要)。

另一方面,我也必须总是一个bakground过程,因为我的应用程序,启动一个BLE广告,让手机成为一个乐设备,所以总是必须“开机”,让其他设备找到手机。

问题是,当我把应用程序放在后台或我杀死应用程序时,这个时间表不会执行或执行几次,直到进程被Android杀死。

谢谢!

共有1个答案

宰父宾实
2023-03-14

在后台工作的唯一有效解决方案是ForregroundService,当您的设备进入Hibernate模式时,其他解决方案将被销毁。您可以在本文中找到更详细的信息,它描述了扫描BLE设备时后台工作的所有障碍。

 类似资料:
  • 问题内容: 什么是最好的Java图像处理库/方法?[关闭]我同时使用JAI媒体API和ImageMagick吗? ImageMagick存在一些可伸缩性问题,基于JNI的JMagick也没有吸引力。与ImageMagick相比,JAI执行大小调整操作时的质量结果较差。 有谁知道过任何出色的开源或商业工具,它们都是本机Java并可以提供高质量的结果? 问题答案: 我知道这个问题已经很老了,但是随着新

  • 问题内容: 我有一个方法可以执行一些超时任务。我使用ExecutorServer.submit()获取Future对象,然后使用超时调用future.get()。这工作正常,但是我的问题是处理可能由我的任务引发的检查异常的最佳方法。以下代码可以正常工作,并保留检查的异常,但是如果方法签名中的检查的异常列表发生更改,则显得非常笨拙且容易中断。 对于如何解决这个问题,有任何的建议吗?我需要以Java

  • 本文向大家介绍Android 蓝牙2.0的使用方法详解,包括了Android 蓝牙2.0的使用方法详解的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Android操作蓝牙2.0的使用方法,供大家参考,具体内容如下 1.Android操作蓝牙2.0的使用流程 (1)找到设备uuid (2)获取蓝牙适配器,使得蓝牙处于可发现模式,获取下位机的socket,并且与上位机建立建立连接,获取获取

  • 我最近看到我的朋友编写的一个 类有很多方法。该类与图像有关,并且具有诸如 我问他为什么要使用。我知道编译器会更改 到 他只是说,它减少了对函数的调用,并且只在实用程序方法上使用它们。每次复制相同的代码不会增加程序大小吗? 现在需要这个吗?如果需要,应该在什么时候使用它们? 编辑 我在Patrick提供的一个列表中列出了大多数问题和优点,以帮助那些不想浏览链接的未来观众。 问题 用扩展的函数体替换调

  • 问题内容: 我正在开发一个使用蓝牙连接到设备并发送/接收数据的应用程序。我正在使用Nexus One手机进行所有测试。 我从手机到任何设备都无法建立SPP(串行端口)连接。不过,我 已经 能够从一个设备(我的笔记本电脑)连接到使用Mac相当于腻子我的手机(唯一的例外是从市场上的“蓝牙文件传输”应用程序似乎是工作,但我不认为使用RFCOM / SPP …)。 我在LogCat日志中始终看到此消息:

  • 我有一个android应用程序,它将所有配对的设备放在一个列表视图中。当您单击其中一个列表项时,它将发起连接到该蓝牙设备的请求。 我可以得到设备的列表和他们的地址没有问题。问题是,一旦我尝试连接,我会在socket.connect()上得到一个IOException; 错误消息如下:“连接读取失败,套接字可能关闭或超时,读取RET:-1” 请注意,在“尝试连接到设备”和“连接失败”之间有大约20秒