1

アプリの実行中と起動時の両方で、AlarmManager を介して投稿されたインテントを処理する必要があります。インテントを処理するために JobIntentService のサブクラスを作成しましたが、期待どおりに動作しません: onHandleWork が呼び出されません。

私の実装は、バックグラウンド サービスの制限による起動時を除いて、ハンドラーが IntentService のときに機能しました。したがって、代わりに JobIntentService を使用しようとしています。

public class MyJobIntentService extends JobIntentService
{
    public int onStartCommand(@Nullable Intent intent, int flags, int startId)
    {
        // This gets called with the intent given to AlarmManager
        return super.onStartCommand(intent, flags, startId);
    }

    public static void enqueueWork(Context context, Intent work)
    {
        // Not called
        enqueueWork(context, NotificationService.class, JOB_ID, work);
    }

    public void onHandleWork(@NonNull Intent intent)
    {
        // Not called
        ...
    }

    // No other methods overridden
}

onStartCommand が呼び出されます。ドキュメントには、この方法は次のように記載されています。

pre-O サービスとして実行されているときに開始コマンドを処理し、後で onHandleWork(Intent) でディスパッチされるようにキューに入れます。

ここで「後で」が何を意味するのかわかりませんが、 onStartCommand が期待される意図で呼び出されたとしても、 onHandleWork は実際には呼び出されません。

同様の質問への回答を読み、他のメソッドをオーバーライドしないようにしました。また、正しいと思われるサービスのマニフェスト エントリを作成しました。そうしないと、onStartCommand が呼び出されません。

これは、AlarmManager で使用される PendingIntent を作成する方法です。

Intent myIntent = new Intent( myContext, MyJobIntentService.class);
...
PendingIntent pendingIntent = PendingIntent.getService( mContext, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
myAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);

私が見逃しているものについてのアイデアはありますか?

4

1 に答える 1