Android Oおよびバックグラウンドサービス

みなさんこんにちは。 ほとんどの開発者と同様、私は面倒すぎてAndroidのバージョンからバージョンに複雑な変更を加えることができませんでした。 このような最初の複雑な変更は、「ランタイム許可」でした。これは、6番目のAndroidでもたらされました。 しかし、これはすでに過去のものです。



この出版物の主題は、Android Oreoの変更です。 詳細はこちらをご覧ください 。 私が見つけたすべての記事は、問題の解決策として、「 JobIntentServiceからサービスを継承し、enqueueWork()で使用するだけです」と述べました。



クール、はい。 しかし、それほど単純ではありません。 CommandProcessorを見ると、onHandleWork()を実行した直後にサービスが停止することがわかります。 これは、IntentServiceが複雑な作業を実行するためのものではなく、イベントの配信、他のサービスの開始などのために作成されたためです。



while ((work = dequeueWork()) != null) { if (DEBUG) Log.d(TAG, "Processing next work: " + work); onHandleWork(work.getIntent()); if (DEBUG) Log.d(TAG, "Completing work: " + work); work.complete(); } //Work @Override public void complete() { if (DEBUG) Log.d(TAG, "Stopping self: #" + mStartId); stopSelf(mStartId); }
      
      





これらの記事とその解決策は、developer.android.comの単なるコピーであるため、私を助けませんでした。 そのため、アプリケーションがバックグラウンド(Android Oとの互換性)にある間に、サービスを使用するための簡単なオプションのテストと検索を続けました。 そして方法を見つけました。



JobIntentServiceを使用すると、昔ながらの方法でサービスを開始できますが、JobIntentServiceによって提供されるコンテキストはこれらの目的には適していませんが、アプリケーションコンテキストをいつでも要求できます。 しかし、アプリケーションコンテキストがある場合でも、サービスが開始されると、Androidの制限により停止されます。



次は? バックグラウンド実行に関するこれらの制限は、startService()を使用してサービスを開始しようとした場合にのみ機能します; bindServiceを使用する場合、Androidはエラーを表示しません。 ただし、バインドの場合、サービスは作成されてアプリケーションにアタッチされるだけであり、必要なメソッド(onHandleWork()またはonHandleIntent()またはサービスの必要なメソッド)を実行するために呼び出すことにより、ServiceConnectionの作成および実装とともにこれをすべて行う必要があります。



これをすべて行った後、私はこれが最も簡単な方法ではないという結論に達しました。 だから私はあなたのためにそれをすべて行うことができる小さくてシンプルなライブラリを書きました。 また、マニフェストで宣言してクラスを作成することなく、バックグラウンドサービスを使用できます。 ここで彼女を見つけることができます。



そして、ギーターからの小さな例:



 //No need to create classes and add manifest declarations ServiceManager.runService(context, () -> {Logg.e(TAG,"Some Action");},true); //if you have already prepared service you can us it as : ServiceManager.runService(context, GeofenceTransitionsIntentService.class); //or if you need to add some data or actions you can use it like : Intent geo = new Intent(context, GeofenceTransitionsIntentService.class); geo.setAction(GeofenceTransitionsIntentService.ACTION_REQUEST_LOCATIONS); ServiceManager.runService(context, geo);
      
      





最後の2つのオプションを使用するには、CompatServiceに従う必要があります

例はここにあります



そして、私が始めたトピック「最初のこのような難しい変更は、実行時のアクセス許可でした」に戻って、この問題に対する私のバージョンのソリューションを評価することもできます。



All Articles