使用非主要构造函数启动服务-传递的变量为onStartCommand

时间:2019-07-15 10:37:51

标签: android kotlin

我有一个带有辅助构造函数和变量的服务(接口MyCallback)。从活动开始服务并传递变量时,服务中的callback.operate()中有一个空指针异常。为什么?登录构造函数已通过,因此我具有非null的回调变量。但是在onStartCommand中它为null ... 在活动中,我实现MyCallback接口并启动服务:

startService(Intent(this, MyService(this)::class.java))


class MyService() : Service() {

    private var callback : MyCallback? = null

    constructor(callback : MyCallback) : this() {
        this.callback = callback
        if (this.callback!=null){
            Log.v("log", "callback not null")
          }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int):Int 
    {
      callback.operate() 
    }
}

2 个答案:

答案 0 :(得分:1)

  

我有一个带有辅助构造函数和变量的服务。

删除辅助构造函数。

  

我在服务中的callback.operate()上有一个空指针异常

startService()将不使用该辅助构造函数。 you 可能使用了辅助构造函数,但这不是有效的Service实例,Android不会使用它。

如果您希望服务与应用程序的其他部分进行通信,则可以:

  • 使用事件总线(LocalBroadcastManager,greenrobot的EventBus等)

  • 让您的服务与某个存储库单例对话,然后单例将信息提供给感兴趣的各方(通过回调,RxJava,LiveData,Kotlin通道/流等)

  • 让活动通过Messenger附加项Intent传递给服务,其中Messenger绑定到该活动可以使用的某些Handler接收服务发送的消息

答案 1 :(得分:0)

  

传递了构造函数的登录信息,所以我有非null的回调变量。

MyService(this)::class.javabound class reference;它将调用MyService(this),获取结果的类(即MyService),然后将创建的实例丢弃。

然后startService将使用主构造函数创建一个新实例。如果您将日志记录更改为

if (this.callback!=null) {
    Log.v("log", "callback not null")
} else {
    Log.v("log", "callback null")
}

您应该首先看到callback not null,然后看到callback null