web-dev-qa-db-ja.com

Androidアプリ/サービスがタスクマネージャーから「強制終了」されるのを防ぐにはどうすればよいですか?

パスワードを持っている人が私のUI画面からサービスを停止するまで、私のサービスを実行し続けることが非常に重要です。私のアプリはうまく動作しますが、親が子供用の電話で(パスワードを使用して)オン/オフするように設計されています。私はなんとかすべてを機能させることができましたが、私が抱えている問題は、子供がタスクマネージャーを使用して私のサービスを強制終了すると、私のアプリが役に立たなくなることです。どちらかへの道を知っている人なら誰にでも感謝します

1)サービスを監視し、「強制終了」された場合は自動的にバックアップを開始します。または2)サービスを起動したアクティビティ(管理画面)以外で誰かがサービスを強制終了できないようにします。または両方?

問題の説明がはっきりしない場合は申し訳ありませんが、私は初心者です。私はこれまで大きな進歩を遂げましたが、この最後のハードルで立ち往生しています。

18
Don

APIメソッドstartForeground()を使用できます。これがその説明です:

開始されたサービスは、startForeground(int、Notification)APIを使用して、サービスをフォアグラウンド状態にすることができます。システムは、サービスをユーザーがアクティブに認識しているものと見なし、メモリが不足しているときに強制終了する候補ではないと見なします。 (理論的には、現在のフォアグラウンドアプリケーションからの極端なメモリプレッシャーの下でサービスが強制終了される可能性がありますが、実際にはこれは問題ではありません。)

ここ これを使用する方法の例を見つけることができます。

質問に関しては、サービスが強制終了されるのを防ぐことはできません。それはシステムによって殺される可能性があります。システムサービスでさえ殺される可能性があります。これが発生した場合、それらは再起動されます。同じアプローチを使用できます。

10
Yury

ルート権限を取得されたデバイスがなければ、これを直接防ぐ方法はありません。 SDKは、この種の問題を防ぐのに役立ちます。

「本当に邪悪な」トリックを実行して、2つのアプリケーションで2つのサービスを利用できます。各サービスは他のサービスを監視し、停止した場合は再起動します。これは厄介ですが、ほとんどの場合、最速の指の子供でさえ両方のアプリケーションを殺すことができませんでした。

5
Yann Ramin

ヘルパーアプリを作成して、Androidブロードキャスト "Android.intent.action.PACKAGE_RESTARTED" を受信します。アプリが強制終了されると、ヘルパーがそのブロードキャストを受信し、アプリなどを再起動できます。

それが「SmartAppProtectorFree」のやり方です。

悪い点は、ユーザーが1つではなく2つのアプリをインストールする必要があることです。

5
Tinfu

まだ答えを探している人のために-これは正しいかもしれません:

次のことはできません。メモリが少ない状態で実行している場合、システムは常にサービスを強制終了します。サービスを強制終了できません。だが

次のことができます。サービスが強制終了されたときにサービスを再起動するようにシステムに指示します。このコードを見てください:

public static final int START_REDELIVER_INTENT

APIレベル5で追加

OnStartCommand(Intent、int、int)から返す定数:

このサービスの開始中に(onStartCommand(Intent、int、int)から戻った後)このサービスのプロセスが強制終了された場合、再起動がスケジュールされ、最後に配信されたIntentがonStartCommand(Intent、int、int、 int)。このインテントは、サービスがonStartCommand(Intent、int、int)に提供された開始IDを使用してstopSelf(int)を呼び出すまで、再配信のスケジュールが設定されたままになります。サービスは、送信されたすべてのインテントの処理が完了していない場合にのみ再起動されるため、nullインテントを含むonStartCommand(Intent、int、int)呼び出しを受信しません(そのような保留中のイベントは、再起動のポイント)。

定数値:3(0x00000003)

3
Matthew Fisher

システムレベルの権限がある場合は、マニフェスト権限を介してpersistent:trueを使用します。

https://developer.Android.com/guide/topics/manifest/application-element

1
JoshuaTree

戻り値の型をSTART_STICKYに設定するだけです。

0
prateek gupta