在我的活动中,我有一个我初始化为这样的广播接收器:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateViews();
}
};updateViews()是仅在广播接收器中使用的活动中的函数。我如何创建这个接收器作为一个单独的类,可以玩视图(旋转,删除等)。我的活动?
此外,我在活动中有一个指南针。它可以工作,但我也想让罗盘成为一个单独的类,可以发送数据到活动。它不会更改活动的视图,而是只更新某些double/float值。
@Override
public void onSensorChanged(SensorEvent event) { }
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { }发布于 2015-07-11 17:58:10
我如何创建这个接收器作为一个单独的类.?
这个答案假设“单独的类”意味着您希望在它自己的源文件中定义一个BroadcastReceiver,而不是一个活动的内部类。在提出解决方案之前,我会问,你希望这样做能得到什么好处?您是否有多个将使用接收器的活动?如果没有,最好将其保留为使用它的单个活动的内部类。如果不喜欢在发布的代码中使用匿名内部类,则可以声明为内部类:
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// As an inner class of the activity, this receiver has
// access to all activity members.
updateViews();
}
}如果您真的希望它成为一个独立的接收方,下面的示例代码就是一个起点。确保在活动的onResume/onPause回调中注册/注销接收方。该示例包括使用普通活动引用的不太安全的方法的代码,以及使用弱引用的安全方法。只需要一个。
public class MyBroadcastReceiver extends BroadcastReceiver {
// For less safe use
private MyClientActivity mActivity;
// For more safe use
private WeakReference<MyClientActivity> mActivityRef;
public MyBroadcastReceiver(MyClientActivity activity) {
mActivity = activity;
mActivityRef = new WeakReference<MyClientActivity>(activity);
}
@Override
public void onReceive(Context context, Intent intent) {
// Less safe
mActivity.findViewById(R.id.action_bar);
mActivity.someActivityMemberMethod();
// etc
// More safe. Guards against failure to unregister
// this receiver when activity is paused.
MyClientActivity act = mActivityRef.get();
if (act != null && !act.isDestroyed()) {
mActivity.findViewById(R.id.action_bar);
mActivity.someActivityMemberMethod();
// etc
} else {
// Error: Activity failed to unregister this receiver
}
}
}我还想让罗盘成为一个单独的类,可以将数据发送到活动中。
同样的假设和问题:指南针会被多种活动使用吗?如果不是,最好将其作为单个活动的内部类。如果有多个客户机活动,请考虑使用启动-服务。它可以使用本地广播或事件总线(如绿色机器人 )通知传感器事件的活动。
https://stackoverflow.com/questions/31356908
复制相似问题