NullPointerException在Android服务中获取BluetoothManager

时间:2014-07-04 13:24:52

标签: android bluetooth bluetooth-lowenergy

我的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
....
}

1 个答案:

答案 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 .. 请阅读文档并确保您的课程正确。

祝你好运。