2011-10-25 11 views
16

私は、アクティビティにプログラムで登録されたブロードキャストレシーバを持っています。これは、パッケージが削除されたときに起動するPACKAGE_REMOVEDインテントに応答します。ブロードキャスト受信者と一時停止したアクティビティ

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

答えて

36

アクティビティでプログラマチックにブロードキャストレシーバを登録すると、アクティビティが一時停止されてもブロードキャストは受信されません。 BroadcastReceiver docsは、この時点で可能なほど明確ではありません。 onPauseの登録を解除することは、単にシステムオーバーヘッドを減らすことを推奨します。

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

+1

現在登​​録されているレシーバは、現在一時停止中のアクティビティ内に存在するマニフェストに登録されている場合、その囲みアクティビティのプライベート変数にアクセスできますか? – Peterdk

+0

気にしなくても、Receiverクラスはインターフェイスではなく、継承するクラスであることがわかりました。 – Peterdk

+0

@chris、これはアンドロイドの文書には記載されていません。 –

2

たぶん、あなたは、あなたのプロジェクトにReceiverを追加し、あなたも、あなたのアプリケーションを起動せずに、このイベントを取得します背景

5

を実行するサービスで受信機を登録することができます。

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) 
      ); 
    } 

} 

とマニフェストで(自分の<アプリケーション>タグの内部で)このようにそれを追加します:あなたはこのように受信機を使用する場合

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

あなたはそれが常に意志任意のレジスタを呼び出したり、登録解除しません。データを取得する準備ができています。

ユーザーがあなたのアプリをSDカードに移動させる場合、これは機能しません。 SDカードのマウントが解除されたときにイベントが送信された場合、受信者はアクセスできなくなり、イベントを見逃します。

関連する問題