将数据从广播接收器传递到活动

时间:2012-10-19 11:17:07

标签: android android-activity broadcastreceiver communication

我有一个正在收听WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的广播接收器。 在该接收器中,我过滤所有可用网络并返回具有特定SSID的网络列表。我已经将该列表传递回我的应用程序的MainActivity。 我知道我可以为我的广播接收器创建一个内部类,但我更喜欢创建一个单独的类以便更好地组织。

我正在考虑在mainActivity类中创建一个静态变量,然后设置该值。 这是一个好习惯吗?

6 个答案:

答案 0 :(得分:2)

通过使用应用程序对象,共享和访问Activites和其他类的交叉信息的好方法。只要您具有应用程序上下文,就可以从所有类访问应用程序对象。

请参阅本教程有关应用程序对象的信息:How to use application object

活动用法:

MyApplicationObject app =(MyApplicationOjbject)getApplicationContext();

app.setMyVariable(可变);

来自活动以外的其他课程

MyApplicationObject app = (MyApplicationOjbject)context.getApplicationContext();
app.setMyVariable(variable);

答案 1 :(得分:2)

Stefan是对的,这个静态链接并不漂亮。您有时可以拥有相同活动的多个实例(重新创建时,直到垃圾收集器收集它)。或者发生多次广播,覆盖静态变量值。

如果您不想使用匿名内部类,则可以覆盖构造函数并传递对当前活动的引用,您可以使用该引用在处理onReceive()时发送结果。完成后只需清理此引用,以避免泄露您的活动。

答案 2 :(得分:1)

我成功地使用了相同的技术。有一次,当我不认为用户可以倾斜屏幕并重新创建活动时,我就是这样。我没有检查静态变量是否已经设置并重复替换它。请注意这一点。

我能想到的另一项技术是在活动和广播接收器之间共享回调。接收器调用回调,该回调存储对正确活动的引用并调用runOnUiThread(action)以进行UI更新。应该在onStart()和onStop()上更新引用。我从来没有真正使用过这种模式。在洗澡时想到它:)。

答案 3 :(得分:1)

我建议不要使用静态变量来传递信息。如果您的主要活动是从接收方接收信息的唯一对象,则将BroadcastReceiver作为主要活动的本地活动。这样做可以对那些负有责任的元素进行分组。

答案 4 :(得分: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);
        }
    }
}

答案 5 :(得分:-1)

如果您从接收器启动Main活动,然后您可以使用putextra()传递列表,然后您可以在主活动中获取该活动。

有点像这样。

Intent intent = new Intent(ctx.getApplicationContext(),targetActivity); intent.putCharSequenceArrayListExtra(name,value);