Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JobService()中的onCreate()函数总是在Android中启动?_Android - Fatal编程技术网

为什么JobService()中的onCreate()函数总是在Android中启动?

为什么JobService()中的onCreate()函数总是在Android中启动?,android,Android,在我看来,JobService()是服务类的子类,它将长期驻留在系统中 onCreate()将只被调用一次,而onStartJob将定期被调用 所以我认为结果会是 Start Server OnCreate Starting Starting Starting 但事实上,onCreate()总是在onStartJob()之前启动,您可以看到图像,为什么 看起来系统发布RestoreService:JobService()很快,但是为什么在系统发布RestoreService:JobServic

在我看来,
JobService()
是服务类的子类,它将长期驻留在系统中

onCreate()
将只被调用一次,而
onStartJob
将定期被调用

所以我认为结果会是

Start Server
OnCreate
Starting
Starting
Starting
但事实上,onCreate()总是在onStartJob()之前启动,您可以看到图像,为什么

看起来系统发布
RestoreService:JobService()
很快,但是为什么在系统发布
RestoreService:JobService()
时不调用onStopJob()

图像

private fun startScheduleRestore(mContext:Context){
   logError("Start Server")

   val interval=10 *1000L

    val mJobScheduler = mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

    val jobInfo = JobInfo.Builder(mContext.getInteger(R.integer.JobID), ComponentName(mContext, RestoreService::class.java))
                        .setPeriodic(interval)
                        .setPersisted(true)
                        .build()

    mJobScheduler.schedule(jobInfo)
}



class RestoreService : JobService() {
    override fun onCreate() {
        logError("OnCreate")
        super.onCreate()
    }

    override fun onDestroy() {
        logError("OnDestory")
        super.onDestroy()
    }

    override fun onStartJob(params: JobParameters): Boolean {
        Thread(Runnable { completeRestore(params) }).start()
        return true
    }

    override fun onStopJob(params: JobParameters): Boolean {
        logError("OnStop")
        return false
    }


    fun completeRestore(parameters: JobParameters) {
        logError("Starting")
        jobFinished(parameters, false)
    }

}

代码

private fun startScheduleRestore(mContext:Context){
   logError("Start Server")

   val interval=10 *1000L

    val mJobScheduler = mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

    val jobInfo = JobInfo.Builder(mContext.getInteger(R.integer.JobID), ComponentName(mContext, RestoreService::class.java))
                        .setPeriodic(interval)
                        .setPersisted(true)
                        .build()

    mJobScheduler.schedule(jobInfo)
}



class RestoreService : JobService() {
    override fun onCreate() {
        logError("OnCreate")
        super.onCreate()
    }

    override fun onDestroy() {
        logError("OnDestory")
        super.onDestroy()
    }

    override fun onStartJob(params: JobParameters): Boolean {
        Thread(Runnable { completeRestore(params) }).start()
        return true
    }

    override fun onStopJob(params: JobParameters): Boolean {
        logError("OnStop")
        return false
    }


    fun completeRestore(parameters: JobParameters) {
        logError("Starting")
        jobFinished(parameters, false)
    }

}

这与谷歌定义的服务生命周期是一致的<在JobService的整个生命周期中,code>onCreate将只调用一次

首次创建服务时由系统调用

由于您正在
completeRestore
中调用
jobFinished
,您的
RestoreService
将被销毁,您的下一个计划将导致创建新的RestoreService。这将依次调用
onCreate

但事实上,onCreate()总是在onStartJob()启动之前启动,您可以 能看到图像,为什么

这是因为根据您的业务逻辑,RestoreService正在启动,执行您在
onStartJob()
方法中提供的重要操作,一旦完成,将在调用
jobFinished()
方法时销毁

系统似乎发布了RestoreService:JobService() 很快,但是为什么系统启动时不调用onStopJob() 释放RestoreService:JobService()


onStopJob()
如果系统确定您必须在有机会调用jobFinished(JobParameters,boolean)之前停止作业的执行,则会调用方法。

谢谢!这是我的问题,为什么每次都触发onCreate?您知道RestoreService是服务器,它将在系统中驻留很长时间。服务不一定会驻留很长时间。事实上,谷歌一直在迫使开发人员不再以这种方式使用服务。谢谢,这是否意味着JobService()不是普通的服务器?它可以通过调用jobFinished(parameters,false)来释放自己,所以每次执行mJobScheduler.schedule(jobInfo),如果调用jobFinished(parameters,false),jobService()总是会重新生成,对吗?谢谢,这是否意味着jobService()不是正常的服务器?它可以通过调用jobFinished(parameters,false)>>True来释放自己。因此,如果在执行mJobScheduler.schedule(jobInfo)时每次调用jobFinished(parameters,false),jobService()总是会重新生成,对吗?>>是的,通过调用jobFinished()参数,您显式地告诉您的服务销毁,并且服务将在下一个时间间隔内再次调用onCreate。