【问题标题】:Why the JobService did not repeat?为什么 JobService 没有重复?
【发布时间】:2019-06-28 06:55:01
【问题描述】:

我正在尝试开发JobScheduler,并且我希望应用程序在被系统杀死时每 1 分钟执行一次。

AndroidManifest.xml

<service
    android:name=".BaiduPush.BaiduJobService"
    android:enabled="true"
    android:permission="android.permission.BIND_JOB_SERVICE"/>

MainActivity

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main2)


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            startJobService()
        }
}

private fun startJobService() {
        Log.d(TAG,"startBaiduJobService")
        val JOB = 10
        val jobScheler = getSystemService((Context.JOB_SCHEDULER_SERVICE)) as JobScheduler
        val jobinfo = JobInfo.Builder(JOB, ComponentName(packageName,BaiduJobService::class.java.name))
                //.setPeriodic(AlarmManager.INTERVAL_FIFTEEN_MINUTES)
                .setOverrideDeadline(60000)
                .setPersisted(true)
                .build()

        jobScheler.schedule(jobinfo)
    }

百度招聘服务

class BaiduJobService : JobService() {

    val TAG = "BaiduJobService"

    override fun onStartJob(params: JobParameters?): Boolean {
        Log.d(TAG,"BaiduJobService onStartJob")
        return true
    }
    override fun onStopJob(params: JobParameters?): Boolean {
        return false
    }

}

当我使用setPeriodic(AlarmManager.INTERVAL_FIFTEEN_MINUTES) 时。 onStartJob 尚未被调用。

当我使用setOverrideDeadline(60000) 时。 onStartJob 第一次只显示一次。

但是时间到了,BaiduJobService 似乎没有被调用。

我错过了什么吗?提前致谢。

【问题讨论】:

  • 保持最小间隙。
  • @AbhayKoradiya 你能详细解释一下吗?

标签: android android-jobscheduler jobservice


【解决方案1】:

我正在使用警报管理器来保持我的服务活跃,它比作业调度程序更好。我在服务 oncreate() 方法中实现了这段代码。

public class CallService extends Service {

        @Override
        public void onCreate() {
            super.onCreate();
            Intent intent = new Intent(this, RestartServiceBroadcast.class);
            mKeepAlivePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60000, 60000, mKeepAlivePendingIntent);
        }

    }

在onRecieve中创建BroadcastReceiver再次调用服务

public class RestartServiceBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("service.RestartService")) {
        // Here Call a Service
    }

    }
}

像这样显示

 <receiver
                android:name=".service.receiver.RestartServiceBroadcast"
                android:enabled="true"
                android:exported="true"
                android:process=":sipStack">
                <intent-filter>
                    <action android:name="service.RestartService" />
                </intent-filter>
   </receiver>

        <service
            android:name=".service.CallService"
            android:enabled="true"
            android:exported="false"
            android:stopWithTask="false">

        </service>

【讨论】:

  • 应用被安卓系统杀死后,AlarmManager会启动吗?
  • 是的,我在 android oreo 版本中进行了测试,它对我来说工作正常
  • 我试过了,但是当应用程序从后台杀死时似乎并不报警。你能发布你的代码吗?
  • 是啊当然..快乐编码
  • 你的调试安卓设备版本是安卓奥利奥吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多