在我的活动中,我有一个我初始化的广播接收器:
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) { }
答案 0 :(得分:0)
如何将此接收器创建为单独的类......?
这个答案假设“单独的类”意味着你想要一个在它自己的源文件中定义的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
}
}
}
我还想让指南针成为可以发送的单独类 数据到活动
与上述相同的假设和问题:指南针是否会被多个活动使用?如果没有,最好将它作为单一活动的内部类。如果 多个客户活动,请考虑使用started-service。它可以使用本地广播或事件总线(例如greenrobot)通知传感器事件的活动。