代码之家  ›  专栏  ›  技术社区  ›  rafvasq

从服务接收活动中的数据

  •  1
  • rafvasq  · 技术社区  · 7 年前

    我已经研究了许多类似问题的解决方案,但我无法找出我的代码有什么问题。我知道本地广播是一种流行的方式,我花了很多时间来实现它。目前,收信人并没有在我的舱单上声明,但根据我的理解,这就是 register 线条代表。

    在我的活动中:

    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("MyActivity", "onReceive");
            String action = intent.getAction();
            int current = intent.getIntExtra("test", 0);
            Toast.makeText(MyActivity.this, current.toString(), Toast.LENGTH_LONG).show();
        }
    };
    
    @Override
    public void onResume() {
        super.onResume();
        Log.d("MyActivity", "onResume()");
        LocalBroadcastManager.getInstance(MyActivity.this).registerReceiver(
                mMessageReceiver, new IntentFilter("currentUpdate"));
    }
    @Override
    protected void onPause() {
        Log.d("MyActivity", "onPause()");
        LocalBroadcastManager.getInstance(MyActivity.this).unregisterReceiver(mMessageReceiver);
        super.onPause();
    }
    

    在服务中,我定义了一个方法:

    private void sendNewBroadcast(Intent intent, int current){
        intent.putExtra("test", current);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
        Log.d("MyService", "new Broadcast sent from service");
    }
    

    我在服务中的其他地方使用它:

    Intent intent = new Intent("currentUpdate");
    sendNewBroadcast(intent, 5);
    

    我已经调试过了,除了“接收”部分,一切都正常。我错过什么了吗?服务是在另一个活动中启动的,并且正在进行中。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mike M.    7 年前

    第一,行动 String 在广播中 Intent 需要与上的操作集匹配 IntentFilter 您正在向注册接收器。最初,他们是不同的,但可能只是一个打字错误。

    其次, LocalBroadcastManager 不跨进程工作。这个 Activity 以及 Service 必须在同一进程中运行才能使用 本地广播 . 如果 服务 需要在一个单独的过程中,您必须使用其他机制;例如, 意图 发送和接收的广播 Context ,一些支持IPC等的事件总线实现。

    推荐文章