2017-06-25 212 views
0

我对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([email protected], TimerService::class.java)) 
     } 

     findViewById(R.id.stopBtn).setOnClickListener { 
      stopService(Intent([email protected], 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()之后立即被触发,而我没有点击停止按钮?

谢谢

+0

也许是因为你有空的'onHandleIntent' –

+0

当onHandleIntent()完成其工作时,Intent服务会自行停止。 –

回答

1

这就是IntentService的工作原理。

IntentService是一个服务的基类,用于按需处理异步请求(表示为Intents)。 [...]

IntentService将收到Intents,启动工作线程,并根据需要停止服务。

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

只要有任务要处理,服务就会一直存在。之后,服务将结束并重新开始下一个任务。

如果你想有一个running service,甚至可能是bound service,你必须直接继承Service和照顾丝扣

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

和终身

注意:为了避免浪费系统资源和消耗电池电量,确保您的应用程序停止其服务时,它的完成工作。如有必要,其他组件可以致电stopService()停止服务。即使您为服务启用了绑定,但如果您收到onStartCommand()的电话,则必须始终自行停止该服务。

+0

谢谢,服务是我所需要的。我试图每隔几秒使用Timer()。schedule()在onStartCommand()内返回START_STICKY之前调用Toast方法。但它只是崩溃(我猜是因为无限循环)。但是我怎样才能达到这个效果呢? – OhMad

+0

Logcat为您提供了错误。你不必假设崩溃的原因。 – tynn