从服务接收 activity 中的数据
Receiving data in activity from a service
我已经查看了许多针对具有类似问题的其他问题的解决方案,但我无法弄清楚我的代码有什么问题。我知道 LocalBroadcast 是一种流行的方式来做到这一点,我已经花时间尝试实现它。目前,接收器未在我的清单中声明,但据我了解,这就是 register
行的用途。
在我的 activity:
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);
我已经调试过了,除了 'receiving' 部分外,一切似乎都正常。我错过了什么吗?该服务在另一个 activity 中启动,并且正在进行中。
首先,广播 Intent
上的操作 String
需要与您注册接收器的 IntentFilter
上设置的操作相匹配。本来是不一样的,可能是打错了。
其次,LocalBroadcastManager
不能跨进程工作。 Activity
和 Service
必须在同一进程中是 运行 才能使用 LocalBroadcastManager
。如果 Service
需要在一个单独的进程中,您将不得不使用其他一些机制;例如,Intent
s,在 Context
上发送和接收的广播,一些支持 IPC 的事件总线实现,等等
我已经查看了许多针对具有类似问题的其他问题的解决方案,但我无法弄清楚我的代码有什么问题。我知道 LocalBroadcast 是一种流行的方式来做到这一点,我已经花时间尝试实现它。目前,接收器未在我的清单中声明,但据我了解,这就是 register
行的用途。
在我的 activity:
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);
我已经调试过了,除了 'receiving' 部分外,一切似乎都正常。我错过了什么吗?该服务在另一个 activity 中启动,并且正在进行中。
首先,广播 Intent
上的操作 String
需要与您注册接收器的 IntentFilter
上设置的操作相匹配。本来是不一样的,可能是打错了。
其次,LocalBroadcastManager
不能跨进程工作。 Activity
和 Service
必须在同一进程中是 运行 才能使用 LocalBroadcastManager
。如果 Service
需要在一个单独的进程中,您将不得不使用其他一些机制;例如,Intent
s,在 Context
上发送和接收的广播,一些支持 IPC 的事件总线实现,等等