2017-10-11 5 views
1

hereのようにバックグラウンドの実行制限をテストしている間に、自分のサービスにスレッドを作成しました。このような何か:作成されたバックグラウンドスレッドは、Androidによって抹消されない

// spawn own thread 
HandlerThread thread = new HandlerThread("TestServiceThread"); 
thread.start(); 

サービスは通常、事前オレオstartServiceによって開始されます。 アンドロイドデバイスモニタでデバッグ中に気づいたことは、作成したスレッドが長生きして正常に動作し、正常に実行できることです。これは、システムリソースを乱用し、フォアグラウンドサービスやジョブを介して何もしないための回避策ですか?またはそれはすぐに終了するフレームワークに対してちょうど追いかけることですか?コメントはありますか?

答えて

1

私はそれが変わるとは思わないでしょう。スレッドを手助けすることなく安全にスレッドを殺すことは不可能です(Androidだけでなく、理論的には不可能)。そうしないと、他のスレッドがデッドロックしたり、データが矛盾したり、アプリが機能しなくなったりすることがあります。そのため、thread.stop()は非推奨になりました。なぜなら、安全にする方法がないからです。そのため、代わりにスレッドを中断し、スレッドはisInterruptedを監視して正常に終了する必要があります。

1

このようなアプローチには注意が必要です。

Gabe Sechanの回答はかなり有効ですが、この作業に頼る危険性はこれを追求するには高すぎます。 Googleは明らかに、バックグラウンドでの実行を試みるアプリを手に入れ、ユーザーのバッテリーを乱用し、正当な理由で私の意見ではない。一部のアプリはユーザーのバッテリーをまったく尊重していません。

ドキュメントは明確に述べて:

を次 のいずれかに該当する場合、アプリがフォアグラウンドにあると考えられている:

それは活動が開始または一時停止しているかどうか、目に見える活動を持っています。 フォアグラウンドサービスがあります。別のフォアグラウンドアプリは のサービスに接続しています。サービスのいずれかにバインドするか、コンテンツプロバイダの を使用してアプリを作成します。たとえば、別のアプリがその:IME壁紙サービスにバインドする場合、アプリケーションは フォアグラウンドにあります 通知リスナー音声またはテキストサービス のいずれの条件も真でない場合、そのアプリはバックグラウンドにあるとみなされます。

出典:それが原因ゲイブで述べたすべての理由にスレッドを殺すために安全ではないですが https://developer.android.com/about/versions/oreo/background.html#services

、アンドロイドはよく、完全に(ALAのkill -9)アプリを殺すことができます。私はデッドロックがAndroidによって(私が確信している些細な作業ではなく)処理されると思います。データの破損は、バックグラウンドでの実行を適切に処理できないというアプリケーションの不具合とみなされます。

これはAndroidの危険性が少しありますが、おそらくそれが重視されており、これが道のりだと判断しました。

また、このの世話をする:

注:デフォルトでは、これらの制限は のAndroid 8.0(APIレベル26)以上をターゲットアプリケーションにのみ適用されます。ただし、 のアプリが26より低いAPIレベルをターゲットにしている場合でも、[設定]画面のすべてのアプリに対して、ほとんどの を有効にすることができます。

出典:https://developer.android.com/about/versions/oreo/background.html#overview

+0

私は同意し、私はオンデマンドのAndroidジョブズ上にバックグラウンド実行を移動しました。 –

関連する問題