我有一个正在收听WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的广播接收器。 在该接收器中,我过滤所有可用网络并返回具有特定SSID的网络列表。我已经将该列表传递回我的应用程序的MainActivity。 我知道我可以为我的广播接收器创建一个内部类,但我更喜欢创建一个单独的类以便更好地组织。
我正在考虑在mainActivity类中创建一个静态变量,然后设置该值。 这是一个好习惯吗?
答案 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);