具有2个Observable的Android可观察模式

时间:2015-07-11 11:54:18

标签: android broadcastreceiver android-sensors observable

在我的活动中,我有一个我初始化的广播接收器:

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) {    }

1 个答案:

答案 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)通知传感器事件的活动。