2011-07-12 26 views
9

ブロードキャスト受信者を呼び出すアクティビティがあります。放送受信機はGPSを待って聞きます。リスナーが新しいポイントを取得すると、その新しいポイントをアクティビティに送信します。ブロードキャスト受信者からアクティビティにデータを送信するにはどうすればよいですか?ブロードキャスト受信者からアクティビティに結果データを送信する方法

ブロードキャスト受信者からの応答を待っているアクティビティにリスナーが必要です。どうやってやるの?

答えて

4

私は受話器のリスナーを定義し、それをアクティビティで使用しました。今は完璧に動作しています。後で問題が起こる可能性はありますか?私のレシーバ・クラスウィッヒで

public interface OnNewLocationListener { 
public abstract void onNewLocationReceived(Location location); 

}

がReceiverPositioningAlarmとして指名されています

// listener ---------------------------------------------------- 

static ArrayList<OnNewLocationListener> arrOnNewLocationListener = 
     new ArrayList<OnNewLocationListener>(); 

// Allows the user to set an Listener and react to the event 
public static void setOnNewLocationListener(
     OnNewLocationListener listener) { 
    arrOnNewLocationListener.add(listener); 
} 

public static void clearOnNewLocationListener(
     OnNewLocationListener listener) { 
    arrOnNewLocationListener.remove(listener); 
} 

// This function is called after the new point received 
private static void OnNewLocationReceived(Location location) { 
    // Check if the Listener was set, otherwise we'll get an Exception when 
    // we try to call it 
    if (arrOnNewLocationListener != null) { 
     // Only trigger the event, when we have any listener 
     for (int i = arrOnNewLocationListener.size() - 1; i >= 0; i--) { 
      arrOnNewLocationListener.get(i).onNewLocationReceived(
        location); 
     } 
    } 
} 

と私の活動の方法のいずれかで:

OnNewLocationListener onNewLocationListener = new OnNewLocationListener() { 
     @Override 
     public void onNewLocationReceived(Location location) { 
      // do something 

      // then stop listening 
      ReceiverPositioningAlarm.clearOnNewLocationListener(this); 
     } 
    }; 

    // start listening for new location 
    ReceiverPositioningAlarm.setOnNewLocationListener(
      onNewLocationListener); 
+3

あなたは強い参照を保持していて、それは悪いかもしれません – GorillaApe

0

アクティビティでブロードキャストレシーバを実装するだけで済みます。レシーバをアクティビティのコンテキストに登録する。

3

あなたにはいくつかの考慮事項があります。

  1. あなたは今、再び情報が到着しているかどうかを確認するためにハンドラ や、タイマーのいずれかを使用して、すべてを確認する意味、ポーリングすることができます。

  2. あなたは、あなたのアクティビティの内部クラスとして放送受信機を登録することができます。その後、あなたはあなたのアクティビティのメソッドを呼び出すことができます。

  3. あなたはブロードキャスト情報を使用してクラスにテントを送ることができますが、あなたのアクティビティがフォアグラウンドでない場合は...

についてのあなたがそれを持って来るかもしれない、それはあなたが望むものを100%ではありませんいくつかの考慮事項は、BroadCastReciverは、リスナーとして、主に内部クラスを参照していないので、私の意見では、アクティビティとの使用のためのベストプラクティスとして、あなたはそれをスタンドアロンクラスとして使用し、Manifest.xmlに登録することができます。 ブロードキャストがブロードキャストされているときに、方向変更やイベントを見逃す可能性のあるアプリケーションを一時停止するイベントが原因で、アクティビティがアクティブでない可能性があることを覚えています。私はシステムイベントを聞くのではなく、私自身のイベントに耳を傾けるので、その問題を防ぐためにスティッキーブロードキャストを使用します。

+0

感謝。第3の解決策では、どうすればその目的を達成できるのでしょうか。もっと説明していただけますか? – breceivemail

+0

コンテキストを使用してインテントを送信します。startActivity() onCreateまたはonResumeのgetIntentメソッドまたはonNewIntentオーバーライドメソッドのいずれかを使用して、アクティビティのインテントを2つの方法のいずれかで取得します。あなたのアクティビティが再開されたかどうかという質問があります。アクティビティjava docとIntent java doc、特にインテントフラグ(SINGLE_TOP)を扱っているjavaドキュメントで詳細を読むことができます – codeScriber

+0

は自分の答えですか? – breceivemail

21

あなたはから受信機を呼び出すことができますあなたの活動。レシーバーのロジックをアクティビティーに追加したくない場合は、抽象レシーバーを使用できます。

あなたは抽象受信機:あなたの活動で

public abstract class SmsReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
      //Add you receiver logic here 
      ... 
      ... 
      onNewPosition(); 
     } 

    protected abstract void onNewPosition(); 

} 

:私はそれはあなたを助けることを願っています

public class MyActivity extends Activity { 

    private smsReceiver smsReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map_one_position); 
     smsReceiver = new smsReceiver() { 

      // this code is call asyncrously from the receiver 
      @Override 
      protected void onNewPosition() { 
      //Add your activty logic here 
      } 

     }; 
     IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
     intentFilter.setPriority(999); 
     this.registerReceiver(smsReceiver, intentFilter); 

    } 

    @Override 
     protected void onPause() { 
      super.onPause(); 
      this.unregisterReceiver(this.smsReceiver); 
     } 

} 

...

+8

どのように抽象クラスをインスタンス化するつもりですか? –

+0

放送受信機は正しくインスタンス化できませんか? – ralphgabb

関連する問題