ブロードキャスト受信者を呼び出すアクティビティがあります。放送受信機はGPSを待って聞きます。リスナーが新しいポイントを取得すると、その新しいポイントをアクティビティに送信します。ブロードキャスト受信者からアクティビティにデータを送信するにはどうすればよいですか?ブロードキャスト受信者からアクティビティに結果データを送信する方法
ブロードキャスト受信者からの応答を待っているアクティビティにリスナーが必要です。どうやってやるの?
ブロードキャスト受信者を呼び出すアクティビティがあります。放送受信機はGPSを待って聞きます。リスナーが新しいポイントを取得すると、その新しいポイントをアクティビティに送信します。ブロードキャスト受信者からアクティビティにデータを送信するにはどうすればよいですか?ブロードキャスト受信者からアクティビティに結果データを送信する方法
ブロードキャスト受信者からの応答を待っているアクティビティにリスナーが必要です。どうやってやるの?
私は受話器のリスナーを定義し、それをアクティビティで使用しました。今は完璧に動作しています。後で問題が起こる可能性はありますか?私のレシーバ・クラスウィッヒで
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);
アクティビティでブロードキャストレシーバを実装するだけで済みます。レシーバをアクティビティのコンテキストに登録する。
あなたにはいくつかの考慮事項があります。
あなたは今、再び情報が到着しているかどうかを確認するためにハンドラ や、タイマーのいずれかを使用して、すべてを確認する意味、ポーリングすることができます。
あなたは、あなたのアクティビティの内部クラスとして放送受信機を登録することができます。その後、あなたはあなたのアクティビティのメソッドを呼び出すことができます。
についてのあなたがそれを持って来るかもしれない、それはあなたが望むものを100%ではありませんいくつかの考慮事項は、BroadCastReciverは、リスナーとして、主に内部クラスを参照していないので、私の意見では、アクティビティとの使用のためのベストプラクティスとして、あなたはそれをスタンドアロンクラスとして使用し、Manifest.xmlに登録することができます。 ブロードキャストがブロードキャストされているときに、方向変更やイベントを見逃す可能性のあるアプリケーションを一時停止するイベントが原因で、アクティビティがアクティブでない可能性があることを覚えています。私はシステムイベントを聞くのではなく、私自身のイベントに耳を傾けるので、その問題を防ぐためにスティッキーブロードキャストを使用します。
感謝。第3の解決策では、どうすればその目的を達成できるのでしょうか。もっと説明していただけますか? – breceivemail
コンテキストを使用してインテントを送信します。startActivity() onCreateまたはonResumeのgetIntentメソッドまたはonNewIntentオーバーライドメソッドのいずれかを使用して、アクティビティのインテントを2つの方法のいずれかで取得します。あなたのアクティビティが再開されたかどうかという質問があります。アクティビティjava docとIntent java doc、特にインテントフラグ(SINGLE_TOP)を扱っているjavaドキュメントで詳細を読むことができます – codeScriber
は自分の答えですか? – breceivemail
あなたはから受信機を呼び出すことができますあなたの活動。レシーバーのロジックをアクティビティーに追加したくない場合は、抽象レシーバーを使用できます。
あなたは抽象受信機:あなたの活動で
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);
}
}
...
どのように抽象クラスをインスタンス化するつもりですか? –
放送受信機は正しくインスタンス化できませんか? – ralphgabb
あなたは強い参照を保持していて、それは悪いかもしれません – GorillaApe