画面がオフのときに、新しいアクティビティを開始するサービスを利用しました。アクティビティを一時停止モードのままにし、停止モードにしないようにします。これを達成する方法はありますか?
7 に答える
いいえ。アクティビティのライフサイクルを制御することはできません。画面がオフのときに実行する必要のあるプロセスはすべて、で実行する必要がありますService
。画面が再びオンになるたびに、アプリケーションの状態を再構築する必要があります。Activity
はいつでもメモリから消去できると常に想定してください。
これを達成する方法はありません。アプリはアクティビティライフサイクルに関連付けられており、ライフサイクルを操作するにはアクティビティを分解/復元する必要があります。
メソッドをオーバーライドすることはできませんonDestroy()
。OS のバージョンごとに、アプリケーションの「強制終了」方法が異なります。
Android 開発者向けドキュメントでは、「killable」状態にあるアプリケーションについて言及しています。Android は、アプリケーションが終了した後 (つまり の後onDestroy
) にもアプリケーションのプロセスを常駐させようとしますが、リソースが少ない状況では、メモリを再利用するためにこれらのプロセスを強制終了できる必要があります。 アプリケーションを強制終了できる状態は、OS のバージョンによって異なります。Android のすべてのバージョンで、アプリケーションから返された、onStop
またはonDestroy
サイレントに強制終了できるアプリケーション。Honeycomm より前のバージョンの Android では、onPause
殺すこともできました。簡単に killable であることは、アプリのコードの別の命令を実行することなく、いつでもアプリのプロセスを終了する権利を Android が留保することを意味します。つまり、回復可能でなければならない状態 (プレーヤーのゲームの進行状況、アイテム、賞など) がある場合は、最後のコールバックまでにそれらを永続ストレージに保存してから、キル可能な状態にする必要があります。
さらに、アプリケーションは、killable 状態であってもネイティブ スレッドを実行できますonDestroy
。これにより、あらゆる種類の破損やシャットダウンの問題が発生する可能性があります。
一時停止モードまたは停止モードの意味が正確にはわかりません。CPUがウェイクアップし続けることを意味する場合は、これを見てください。
partial_wake_look を使用すると、たとえば画面がオフの場合でも、長時間実行される AsyncTask を持つことができます。ウェイクルックをリリースすることを忘れないでください。
なぜこれを行う必要があるのですか?おそらく最善の解決策は、@DeeVが提案するようにサービスとして実行することです。ただし、何をする必要があるかによっては、これが役立つ場合があります。
画面がオンになったとき (および必要に応じてオフになったとき) に通知するように Android に依頼します。したがって、アクティビティを再開してすぐに開始し、あらゆるアクションを実行できます。
それを行うには:
- Application を拡張するクラスを作成する
- マニフェストに登録します。
public void onCreate() {... で、これを追加します。
IntentFilter ioff = new IntentFilter(Intent.ACTION_SCREEN_OFF);
IntentFilter イオン = 新しい IntentFilter(Intent.ACTION_SCREEN_ON);
broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_SCREEN_OFF.equals(action)) { //TODO } else { //TODO } } }; context.registerReceiver(broadcastReceiver, ioff); context.registerReceiver(broadcastReceiver, ion);
- public void onTerminate() {... で、これを追加します。
if (broadcastReceiver != null) {
context.unregisterReceiver(broadcastReceiver);
}