16

放送受信機をプログラムでアクティビティに登録しています。PACKAGE_REMOVEDこれは、パッケージが削除されたときに起動するインテントに応答します。

問題は、このメッセージが表示されないことです。これは、アクティビティを終了して別のアクティビティに移動してアプリをアンインストールするとインテントが起動され、元のアクティビティが一時停止されたためだと思います。一時停止されたアクティビティ(受信者が登録解除されていない場合onPause)も受信者を一時停止している可能性がありますか?

4

3 に答える 3

38

ブロードキャストレシーバーをプログラムでアクティビティに登録すると、アクティビティが一時停止されたときにブロードキャストは取得されません。BroadcastReceiverのドキュメントは、この点に関してはそれほど明確ではありません。システムのオーバーヘッドを減らすためだけに、onPauseで登録を解除することをお勧めします。

アクティビティがフォアグラウンドにない場合でもイベントを受信する場合は、receiver要素を使用してマニフェストにレシーバーを登録します。

于 2011-11-10T16:56:08.250 に答える
5

プロジェクトにReceiverを追加すると、アプリケーションを起動しなくてもこのイベントが発生します。

public class TestReciver extends BroadcastReceiver  {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("TestReciver",intent.getAction()+"\n"
                +intent.getDataString()+"\n"
                +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n"
                +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n"
                +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)
            );
    }

}

マニフェストに次のように追加します(<application>タグ内):

<receiver android:name="TestReciver" >
    <intent-filter >
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

このようなレシーバーを使用する場合、レジスターを呼び出したり、レジスターを解除したりしないため、常にデータを取得できるようになります。

ユーザーにアプリをSDカードに移動させた場合、これは機能しないことに注意してください。SDカードがマウントされていないときにイベントが送信されると、レシーバーにアクセスできなくなり、イベントを見逃してしまいます。

于 2011-11-11T21:55:16.430 に答える
2

たぶんあなたはバックグラウンドで実行されるサービスで受信機を登録することができます

于 2011-11-11T03:10:35.970 に答える