1

WifiManager.SCAN_RESULTS_AVAILABLE_ACTION をリッスンしているブロードキャスト レシーバーがあります。その受信機で、利用可能なすべてのネットワークをフィルタリングし、特定の SSID を持つネットワークのリストを返します。そのリストをアプリケーションの MainActivity に戻す必要がありました。ブロードキャスト レシーバーの内部クラスを作成できることはわかっていますが、編成を改善するために別のクラスを作成することを好みます。

mainActivity クラスに静的変数を作成し、その値を設定することを考えています。これは良い習慣ですか?

4

6 に答える 6

2

ステファンは正しいです、この静的リンクはきれいではありません。同じアクティビティの複数のインスタンスを持つことができる場合があります(再作成されると、ガベージコレクターがそれを収集するまで)。または、複数のブロードキャストが発生し、静的変数値が上書きされます。

匿名の内部クラスを使用したくない場合は、コンストラクターをオーバーライドして、処理時に結果を送信するために使用できる現在のアクティビティへの参照を渡すことができますonReceive()。アクティビティが漏れないように、完了したらこの参照をクリーンアップしてください。

于 2012-10-19T14:38:13.570 に答える
2

アプリケーション オブジェクトを使用すると、Activites と他のクラスの間で情報を共有したり、情報にアクセスしたりすることができます。アプリケーション コンテキストがあれば、すべてのクラスからアプリケーション オブジェクトにアクセスできます。

アプリケーション オブジェクトに関するこのチュートリアルを参照してください:アプリケーション オブジェクトの使用方法

アクティビティからの使用:

MyApplicationObject app = (MyApplicationOjbject)getApplicationContext();

app.setMyVariable(変数);

活動外の他のクラスから

MyApplicationObject app = (MyApplicationOjbject)context.getApplicationContext();
app.setMyVariable(variable);
于 2012-10-19T11:31:35.757 に答える
1

私は同じテクニックを使って成功しました。これが私を苦しめたのは、ユーザーが画面を傾けることができ、アクティビティが再作成されるとは考えていなかったときでした。静的変数が既に設定されているかどうかを確認できず、繰り返し置き換えました。気をつけてください。

考えられるもう 1 つの手法は、アクティビティとブロードキャスト レシーバーの間でコールバックを共有することです。レシーバーは、適切なアクティビティへの参照を格納するコールバックを呼び出し、runOnUiThread(action) を呼び出して UI を更新します。参照は onStart() および onStop() で更新する必要があります。私はこのパターンを実際に使用したことはありません。シャワーでそれについて考えました:)

于 2012-10-19T11:32:23.743 に答える
1

情報を配信するために静的変数を使用しないことをお勧めします。メイン アクティビティがレシーバーから情報を受け取る唯一のオブジェクトである場合は、BroadcastReceiverローカルをメイン アクティビティにします。そうすることで、責任を共有する要素がグループ化されます。

于 2012-10-19T11:37:03.790 に答える
0

これは、ブロードキャストからデータを取得する方法です。コードは少し増えますが、複雑なものが発生した場合に備えて、将来のために読みやすくなります。

Intent intent = new Intent(context, BroadcastReciever.class);
SimpleResultReciever resultReciever = new SimpleResultReciever(new Handler())
         .setCallback(new OnLocationCallback() {
             @Override
             public void onRecieverLocation(Location location) {
                  if(location != null) {
                        MainActivity.this.location = location;
                   }
             }
         });
intent.putExtra(SimpleResultReciever.KEY_RESULT_RECIEVER, resultReciever);
//call intent or create pending intent you will use broadcast stuff.


public class SimpleResultReciever extends ResultReceiver {

    public final static String KEY_RESULT_RECIEVER = "bundle.broadcast.reciever.callback";

    private OnLocationCallback callback;

    public LocationResultReciever setCallback(OnLocationCallback callback) {
        this.callback = callback;
        return this;
    }

    /**
     * Create a new ResultReceive to receive results.  Your
     * {@link #onReceiveResult} method will be called from the thread running
     * <var>handler</var> if given, or from an arbitrary thread if null.
     *
     * @param handler
     */
    public LocationResultReciever(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        super.onReceiveResult(resultCode, resultData);
        Location location = resultData.getParcelable(LocationManager.KEY_LOCATION_CHANGED);
        if(callback != null) {
            callback.onRecieverLocation(location);
        }
    }
}



public class LocationBroadcastReciever extends BroadcastReceiver {

    public LocationBroadcastReciever() {
        super();
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extra = intent.getExtras();
        Location location = extra.getParcelable(LocationManager.KEY_LOCATION_CHANGED);
        ResultReceiver res = extra.getParcelable(LocationResultReciever.KEY_RESULT_RECIEVER);
        if(res != null) {
            Bundle data = new Bundle();
            data.putParcelable(LocationManager.KEY_LOCATION_CHANGED, location);
            res.send(Activity.RESULT_OK, data);
        }
    }
}
于 2014-09-28T11:51:42.787 に答える
-1

レシーバーからメイン アクティビティを起動し、putextra() を使用してリストを渡すことができれば、メイン アクティビティでそれを取得できます。

このようなもの。

インテント インテント = 新しいインテント(ctx.getApplicationContext(), targetActivity); インテント.putCharSequenceArrayListExtra(名前、値);

于 2012-10-19T11:32:16.280 に答える