在后台运行服务

时间:2017-06-25 10:26:18

标签: android service kotlin

我是Android开发的新手,我并没有真正理解IntentServices的工作方式。这就是我到目前为止所做的:

class TimerActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_timer)

        findViewById(R.id.startBtn).setOnClickListener {
            startService(Intent(this@TimerActivity, TimerService::class.java))
        }

        findViewById(R.id.stopBtn).setOnClickListener {
            stopService(Intent(this@TimerActivity, TimerService::class.java))
        }
    }
}

class TimerService : IntentService("TimerService") {

    override fun onCreate(){
        super.onCreate()
        toast("Started activity")
    }

    override fun onDestroy(){
        super.onDestroy()
        toast("Stopped activity")
    }

    override fun onHandleIntent(intent: Intent?) {

    }
}

我正在尝试在单击按钮时在后台启动活动,并在单击另一个按钮时停止它。但是为什么onDestroy()会在onCreate()之后立即被触发,而我没有点击停止按钮?

由于

1 个答案:

答案 0 :(得分:1)

IntentService的工作原理。

  

IntentService是服务的基类,可根据需要处理异步请求(表示为Intents)。 [...]

     

[...] IntentService将接收Intents,启动工作线程,并在适当时停止服务。

     

所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。

只要有要处理的任务,服务就会生效。之后,服务将结束并重新启动下一个任务。

如果你想拥有running service,甚至可能是bound service,你必须直接继承Service并处理线程

  

警告:默认情况下,服务在与声明它的应用程序相同的进程中运行,并在该应用程序的主线程中运行。如果您的服务在用户与同一应用程序中的活动进行交互时执行密集或阻止操作,则该服务会降低活动性能。为避免影响应用程序性能,请在服务中启动一个新线程。

和终生

  

注意:为避免浪费系统资源和消耗电池电量,请确保应用程序在完成工作后停止服务。如有必要,其他组件可以通过调用stopService()来停止服务。即使您为服务启用了绑定,也必须始终在收到onStartCommand()的呼叫时自行停止服务。