1

私はこのコードに出くわしました:

<receiver android:name=".SampleBootReceiver"
        android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

ここでAlarmManagerについて読んでいる間、なぜ彼らはレシーバーをenabled = falseと宣言するのかわかりませんか? システムがレシーバーをインスタンス化できるようにしたくないのはなぜですか。一般に、システムによってインスタンス化できない XML でレシーバーを宣言するポイントは何ですか?

4

1 に答える 1

2

彼らがレシーバーを有効 = false と宣言する理由がわかりません。

レシーバーは必ずしも必要ではないためです。

システムがレシーバーをインスタンス化できるようにしたくないのはなぜですか

レシーバーは必ずしも必要ではないためです。

システムによってインスタンス化できない XML でレシーバーを宣言するポイントは何ですか?

レシーバーは、後で必要になったときに有効にできるためです。

たとえば、 の実装を提供する Download アプリケーションのようなものを実装しているとしDownloadManagerます。ファイルのダウンロード中に、おそらくデバイスが再起動します。理想的には、再起動が完了した後にダウンロードを再開したいと考えています。ただし、ほとんどの場合、ファイルはダウンロードされていないため、通常はブート時に制御を取得する必要はありません。

怠惰なアプローチは、起動時に常に制御を取得し、再起動時に未処理のダウンロードがあったかどうかを確認し、ある場合はダウンロードを再開し、ない場合はただ立ち去るというものです。これは、Android にプロセスを fork させ、一連のプロセス設定作業を強制するため、無駄です。最終的には、ユーザーのために何もしません。

より良いアプローチは、ブート完了レシーバーを通常どおり無効にすることです。ファイルのダウンロード要求が来たら、setComponentEnabledSetting()onを使用してレシーバーを有効PackageManagerにし、ダウンロードが完了したら再度無効にします。現在、進行中のダウンロードがある再起動時にのみ、起動時に制御を取得し、残りの時間の起動プロセスを高速化します.

より一般的には、マニフェストに登録されたレシーバーからのブロードキャスト (特にシステム ブロードキャスト) をリッスンしたいが、ごくたまにsetComponentEnabledSetting(). 通常、受信機を無効にすることから始めますが、これは厳密な要件ではありません。

于 2015-10-17T14:15:07.733 に答える