1

私はレシーバーで遊ぶ時間がありませんでした。また、2.3.xを超えるものに慣れていないので、この質問を読んだときに完全に戸惑いました。AndroidManifestに
登録されたBroadcastReceiverは、アプリケーションプロセスが強制終了されたときにインテントを受信できますか?

その作成者は、タスクマネージャーリストでBroadcastReceiverアプリケーションを確認できます。アプリが強制終了されると、ブロードキャストレシーバーは呼び出されなくなります。これは、3.1で導入された新しいメカニズムによるものです:http:
//developer.android.com/sdk/android-3.1.html#launchcontrols

そのリンクには、アプリケーションの停止状態が記載されています。アプリケーションのライフサイクルは、ドキュメントAFAIKのどこにも説明されていないため、アプリは次の3つの状態のいずれかになります。

  • 停止しました(RAMにはありません)
  • 開始(RAM内、実行されていない)
  • 実行中(RAM内)

ユーザーがタスクマネージャーでアプリを表示できるようにするには、アプリが開始状態または実行状態のいずれかである必要があります(さらに状態があるかどうかわからないため、ここで推測しています)。そして、アプリはかなりの時間リストに表示されていたようです。レシーバーアプリが起動または実行されている場合は、独自のDalvikVMインスタンスを備えたLinuxホスティングプロセスが必要です。これは、レシーバーがどのように機能するかについての私の以前の信念と矛盾しています。

  • レシーバーが実行されていない場合、システムのパフォーマンスが低下することはありません。
  • 受信者に通知する必要があると、新しいフォアグラウンドプロセスが生成され(まだ実行されていない場合)、新しい受信者がインスタンス化され、onReceiveメソッドが呼び出されます。
  • 最大処理時間が10秒後にonReceive戻り、追加のサービスまたはアクティビティがない場合、ホスティングプロセスが強制終了され、リソースが解放される可能性が非常に高くなります。

だから、私の質問:

  1. アプリがタスクマネージャーに表示されているが(したがってプロセスがある)、まだ通知されていない場合、OSが通知されていない(まったく通知されていない可能性がある)レシーバーのプロセスを生成するのはなぜですか? 。アプリに通知されたが、プロセスがまだ強制終了されていない場合(したがって、タスクマネージャーに一覧表示されている場合)、OSが完了後すぐに強制終了しないのはなぜですか?ここでは、タスクマネージャーがプロセスが割り当てられている場合にのみアプリケーションを表示すると想定していますが、これにより次の質問が発生します。
  2. レシーバープロセスがタスクマネージャーにリストされる可能性はどのくらいありますか?タスクマネージャーは、停止している場合でもレシーバーアプリを表示しますか?もしそうなら、これは3.1以降の新しい動作であり、ユーザーはそれが存在することに気づき、強制的に閉じることができますか?そうでない場合、アプリケーションは、呼び出しの途中onReceiveまたは戻った後、強制終了の対象となる場合にのみリストに表示されます。これは、ドキュメントによると、短い間隔である必要があります。

前もって感謝します。

4

1 に答える 1

2

したがって、アプリは次の 3 つの状態のいずれかになる可能性があると思います: 停止 (RAM にない)、開始 (RAM にある、実行されていない)、実行中 (RAM にある)

用語や言語の問題かもしれませんが、少なくとも私がどのように表現するかは正確ではありません。

プロセスが実行中か、実行されていないかのいずれかです。「RAM内」および「実行されていない」ことはできません。

この概念とは別に、Android 3.1以降、アプリケーションはマニフェスト登録BroadcastReceiversを無効または有効にすることができます。ドキュメントでは、無効な状態を「停止」と呼んでいますが、これは Google 側の非常に残念な用語の選択であり、私は何度か不満を述べてきました。この状態への言及を目にした場合、「停止」という用語の他の定義は無視してください。実際、この状態を別の用語で表すこともできます。たとえば、「snicklefritzed」などです。

あなたのアプリは、インストール直後にスニクルフリッツされます. 何かがコンポーネントの 1 つを明示的に実行すると (たとえば、ユーザーがホーム画面からアクティビティを手動で起動するなど)、アプリは「通常の」状態に移行します。ユーザーが [設定] からアプリを強制停止すると、アプリは元の状態に戻ります。アプリが正常かスニクルフリッツかに関する情報は、OS が管理するファイルに保持され、(AFAIK) OS プロセスにキャッシュされます。

したがって、アプリケーションは次のいずれかになります。

  • 実行されていません (プロセスがありません) と snicklefritzed
  • 実行されていない (プロセスがない) およびスニクルフリッツされていない
  • 実行中 (プロセスがあります) であり、snicklefritzed ではありません

(何かを実行する行為は、snicklefritzed 状態からあなたを動かし、強制停止はプロセスを終了させるため、実行中と snicklefritzed 状態になることはできません)

レシーバーが実行されていない場合、システムのパフォーマンスが低下することはありません。

正しい。

レシーバーに通知する必要がある場合、新しいフォアグラウンド プロセスが生成され (まだ実行されていない場合)、新しいレシーバーがインスタンス化され、onReceive メソッドが呼び出されます。

正しい。

10 秒の最大処理時間の後、onReceive が返され、追加のサービスまたはアクティビティがない場合、ホスティング プロセスが強制終了され、リソースが解放される可能性が非常に高くなります。

「ホスティングプロセスは強制終了する資格があり、OSが他のプロセスのためにRAMを必要とするため、強制終了する優先度キューで比較的高くなります」と表現します。

OS が、通知さえされていない (そしてまったく通知されない可能性がある) レシーバーのプロセスを生成するのはなぜですか。

そうではありません。snicklefritzed アプリのマニフェスト登録BroadcastReceiversは無視されます。

タスク マネージャーにレシーバー プロセスが表示される可能性はどのくらいですか?

プロセスの実行中は 100%。プロセスが実行されていない場合は 0%。

これは 3.1+ の新しい動作で、ユーザーはその存在に気づき、強制的に閉じることができますか?

「これ」と「それ」と言うとき、あなたが何を指しているのかわかりません。

それとも、2.x OS であっても、システムに十分なメモリがある場合の通常の動作ですか?

あなたが「それ」と言ったとき、あなたが何を指しているのか、私にはまだわかりません。

于 2012-08-01T16:31:43.800 に答える