我的Discovery
课程延长了Service
课程。当我试图以这种方式从另一个类中获取它的单例时:
Discovery discovery = Discovery.getInstance();
我收到NullPointerException。这是发现代码:
public static Discovery getInstance(){
if (discovery == null){
discovery = new Discovery();
discovery.initDiscovery ();
}
Log.i(TAG, "get discovery instance");
return discovery;
}
public Discovery() {
}
private void initDiscovery(){
mDiscoveredDevices = new ArrayList<String>();
BluetoothManager bluetoothManager = (BluetoothManager) discovery.getSystemService(Context.BLUETOOTH_SERVICE);<--NullPointerException
....
}
答案 0 :(得分:3)
这不是Android我的朋友。
要创建服务,您需要在清单中声明它:
<service
android:name=".DiscoveryService" />
之后您可以实例化它,但从不使用operator new 。相反,你需要打电话:
startService(context, new Intent(context, DiscoveryService.class);
还有其他方法可以解雇服务意图,但现在就足够了。
服务的构造代码应放在onCreate:
class DiscoveryService extends Service {
@Override
public void onCreate() {
service construction code here
}
}
它的请求处理onStartCommand中的代码:
public int onStartCommand(Intent intent, int flags, int startId) {
handle incoming intent
}
现在,如果您确实需要以最简单的方式访问服务实例
实现它将是声明和维护一个静态实例引用
服务。这样做:
class DiscoveryService extends Service {
private static DiscoveryService inst; // <-----------------
public DiscoveryService getInstance() {
return inst;
}
@Override
public void onCreate() {
service construction code here
inst = this;
}
@Override
public void onDestroy() {
cleanup code here
inst = null;
}
}
这种方法有其缺点,但与你的不同,它会起作用。仍然谨慎使用。
最后 - 多年的写作和回顾Android代码让我得出结论
大多数新手开发人员在要求Service时想要的,实际上是IntentService ..
请阅读文档并确保您的课程正确。