我有一个包装类(BluetoothDiscoverer),它在服务中实例化。此类获取BluetoothAdapter并在扫描相邻设备之前检查蓝牙是否已启用。
现在,如果未启用蓝牙,我希望能够在此课程中执行以下操作(BluetoothDiscoverer):
Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, BLUETOOTH_ENABLER);
现在我读过这个:use startActivityForResult from non-activity
但是我不想将我的主要活动传递给这个对象,因为我想处理结果(用户是否接受启用蓝牙) 在BluetoothDiscoverer类中。
现在如果我将BluetoothDiscoverer作为Activity的子类
当即将调用startActivityForResult时,我似乎得到了NullPointerException。
我认为这是因为我需要添加一个onCreate()/ onDestroy()方法, 但这违背了我正在做的目的,因为我需要能够在实例化该类的服务中调用BluetoothDiscoverer对象上的方法。
我还需要注册广播接收器,以便在启动扫描时检索相邻设备。如果BluetoothDiscoverer类不是Activity,我该如何注册此接收器?
有解决方法吗?
谢谢 安德烈亚斯
答案 0 :(得分:6)
startActivityForResult()
仅适用于真实的屏幕活动。请重新设计您的应用程序,以便用户界面来自活动,然后让您的服务扫描设备。
我还需要注册广播接收器,以便在启动扫描时检索相邻设备。如果BluetoothDiscoverer类不是Activity,我该如何注册此接收器?
你摆脱BluetoothDiscoverer
并将其逻辑移入Service
,这是一个Context
,因此可以注册接收者。
答案 1 :(得分:0)
在Service
中,创建一个Activity
,其目的是请求蓝牙可发现性。为此Messenger
传递Intent
和Activity
,并让Activity
启动可发现性活动:
Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, BLUETOOTH_ENABLER);
然后,在onActivityResult()
内通过Messenger
向您的服务发送消息。