Android Lollipop に付属している新しい JoScheduler API を試しています。これまでのところ、問題なくネットワーク要件なしで 6000 ミリ秒の遅延でジョブを正常に作成して実行することができました。
ただし、 setPersisted(true) 関数を使用して同じジョブを永続化しようとしました。ジョブ build() 関数が呼び出されるとすぐに、マニフェスト ファイルに RECEIVED_BOOT_COMPLETED 権限が必要であると言って失敗します。
しかし、私は許可を追加しました:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
アプリに権限が登録されているかどうかを確認するために、ジョブを追加する前に次のコードを追加しました。
PackageManager pm = context.getPackageManager();
int hasPerm = pm.checkPermission(Permission.RECEIVE_BOOT_COMPLETED,
context.getPackageName());
if (hasPerm == PackageManager.PERMISSION_GRANTED)
{
// Goes into here every time
}
ただし、ジョブがビルドされると、次のエラーが発生します。
java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission.
ジョブを作成して JobSchedular に追加する私のコード:
ComponentName serviceComponent = new ComponentName(getApplicationContext(), MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(1, serviceComponent)
.setMinimumLatency(6000)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true);
JobScheduler jobScheduler = (JobScheduler) getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
私の JobService マニフェスト宣言:
<service
android:name=".service.MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true" >
</service>
だから、私は誰かが見つけられる何か他のことをしているのだろうかと思っています。違いが生じる場合に注意する唯一のことは、コードが IntentService で実行されることです。これが、JobScheduler がアクセス許可を見つけられない理由であるかどうか疑問に思っています。