【问题标题】:Can I use a callback method from a BroadcastReceiver?我可以使用 BroadcastReceiver 的回调方法吗?
【发布时间】:2014-03-01 14:52:08
【问题描述】:

学习使用Android中的BroadcastReceiver类,我写了一个小程序接收电池充电状态,并写入一个activity中的三个TextView字段。

但是,我将 BroadcastReceiver 作为一个单独的类,以使其更简单并与活动分开。因此,我必须找到一种方法来告诉我的 Activity 类电池数据已更新,或者,这是我的解决方案,将 TextView 字段的引用从 Activity 传递给 BroadcastReceiver 类。

有谁知道是否可以从广播接收器创建一个回调方法来启动一个函数,f.ex。更新文本视图();在活动中?

这里是源代码 - 注意有两个 java 文件: http://pastebin.com/qjCTsSuH

问候,尼尔斯。

【问题讨论】:

    标签: android


    【解决方案1】:

    对我有用的只是将接口对象声明为静态的。请记住,尽管静态会导致与它们解决的问题一样多,因为静态会在实例中保持它们的值。

    public class MainActivity extends AppCompatActivity implements SocketMessageReceiver.ISocketMessageReceiver {
    
        //Declare the cb interface static in your activity
        private static SocketMessageReceiver.ISocketMessageReceiver iSocketMessageReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
    
            //Assign this
            iSocketMessageReceiver = this;
            socketMessageReceiver.registerCallback(iSocketMessageReceiver);
        }
    
        @Override
        public void sendSocketMessage(String socketMessage) {
            lblEchoMessage.setText(socketMessage);
        }
    
    }
    

    在你的接收器中......

    public class SocketMessageReceiver extends BroadcastReceiver {
    
        interface ISocketMessageReceiver {
            void sendSocketMessage(String socketMessage);
        }
    
        //Also declare the interface in your BroadcastReceiver as static
        private static ISocketMessageReceiver iSocketMessageReceiver;
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            if(intent.getAction().equals("com.WarwickWestonWright.SocketExample.RECEIVE")) {
                iSocketMessageReceiver.sendSocketMessage(intent.getBundleExtra("DATA").getString("DATA"));
            }
    
        }
    
        public void registerCallback(ISocketMessageReceiver iSocketMessageReceiver) {
            this.iSocketMessageReceiver = iSocketMessageReceiver;
        }
    
    }
    

    【讨论】:

    • 这对我有用,但你唯一错过的是在 MainActivity 类中声明 socketMessageReceiver 对象。
    【解决方案2】:

    我已将 BroadcastReceiver 作为一个单独的类以使其更简单

    恕我直言,你让它变得更复杂了。

    因此,我必须找到一种方法来告诉我的 Activity 类电池数据已更新,或者,这是我的解决方案,将 TextView 字段的引用从 Activity 传递给 BroadcastReceiver 类。

    选项#1:回到使用BroadcastReceiver 的内部类。 ACTION_BATTERY_CHANGED 无论如何只能通过registerReceiver() 使用。只需让onReceive() 调用 Activity 上的某个方法来完成更新 UI 的工作。

    选项#2:将您的活动传递到BroadcastReceiver 的构造函数中,并按照选项#1 调用方法。

    选项 #3:使用事件总线,例如 Square 的 Otto 或 greenrobot 的 EventBus。

    【讨论】:

    • 谢谢。现在使用选项 #2。
    • 如果你有很多广播要在一个活动中接收,那么最好的做法是在你的活动中使用一个广播接收器并且只有多个意图过滤器吗?
    • @MicroR:嗯,可能。这很难抽象地回答。
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多