如何使用广播接收器在 android 和另一个进程之间进行通信
How to communicate between android and another process using broadcast receiver
我在 Activity 和我的清单中另一个进程中定义的服务之间注册 broadcastReceiver
时遇到问题。
我尝试了一些其他技巧,例如使用 handlers
或 ContentProvider
用于通信但它没有像我预期的那样工作,事实上我想连续获取数据。
这是我服务中的代码:
Intent locationIntent = new Intent("LocationIntent");
locationIntent.setAction("updatedLocations");
locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
我在 Activity 的 OnCreate
中注册了它:
updatedLocationBroadcast = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Timber.tag("localB").d("registered!");
if (intent != null && intent.getAction() != null && intent.getAction().equals("updatedLocations")) {
sawLocationsList = (HashMap<Integer, MarkerItem>)intent.getSerializableExtra("list");
Timber.tag("sawL").d("updated" + sawLocationsList.toString());
}
}
};
registerReceiver(updatedLocationBroadcast , new IntentFilter("updatedLocations"));
如我所料,我想查看我的 broadcastReceiver
寄存器和我的 Timber
日志 localB registered!
,它们在我的接收器中定义,但它不起作用。
那么,在 Activity 和另一个 process
中定义的服务之间进行通信并持续获取数据的最佳方式是什么???
注意:我的服务从服务器获取数据,但服务器不是实时的,所以我通过使用 handlers
.
定期向服务器请求来检查数据
but it doesn't work
那是因为你 over-specified 你的 Intent
。替换:
Intent locationIntent = new Intent("LocationIntent");
locationIntent.setAction("updatedLocations");
locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
与:
Intent locationIntent = new Intent("updatedLocations");
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
不过请注意,任何应用都可以收听此广播。考虑在 Intent
上使用 setPackage()
来限制传送到您自己的应用程序。
What's the best way to communicate between Activity and Service defined in another process and getting data continuously?
如果我被迫进行这个过程分离,我会考虑Messenger
。
my service gets data from server but the server is not realTime so I check the data by requesting periodically to server using handlers.
多年来,这一直不是推荐的模式。请使用 WorkManager
。或者,如果您无法采用 WorkManager
(因为它是 AndroidX 的一部分),请使用 JobScheduler
。在这两种方法中的任何一种中,您都可以摆脱第二个过程并大大简化您的通信。
我在 Activity 和我的清单中另一个进程中定义的服务之间注册 broadcastReceiver
时遇到问题。
我尝试了一些其他技巧,例如使用 handlers
或 ContentProvider
用于通信但它没有像我预期的那样工作,事实上我想连续获取数据。
这是我服务中的代码:
Intent locationIntent = new Intent("LocationIntent");
locationIntent.setAction("updatedLocations");
locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
我在 Activity 的 OnCreate
中注册了它:
updatedLocationBroadcast = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Timber.tag("localB").d("registered!");
if (intent != null && intent.getAction() != null && intent.getAction().equals("updatedLocations")) {
sawLocationsList = (HashMap<Integer, MarkerItem>)intent.getSerializableExtra("list");
Timber.tag("sawL").d("updated" + sawLocationsList.toString());
}
}
};
registerReceiver(updatedLocationBroadcast , new IntentFilter("updatedLocations"));
如我所料,我想查看我的 broadcastReceiver
寄存器和我的 Timber
日志 localB registered!
,它们在我的接收器中定义,但它不起作用。
那么,在 Activity 和另一个 process
中定义的服务之间进行通信并持续获取数据的最佳方式是什么???
注意:我的服务从服务器获取数据,但服务器不是实时的,所以我通过使用 handlers
.
but it doesn't work
那是因为你 over-specified 你的 Intent
。替换:
Intent locationIntent = new Intent("LocationIntent");
locationIntent.setAction("updatedLocations");
locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
与:
Intent locationIntent = new Intent("updatedLocations");
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
不过请注意,任何应用都可以收听此广播。考虑在 Intent
上使用 setPackage()
来限制传送到您自己的应用程序。
What's the best way to communicate between Activity and Service defined in another process and getting data continuously?
如果我被迫进行这个过程分离,我会考虑Messenger
。
my service gets data from server but the server is not realTime so I check the data by requesting periodically to server using handlers.
多年来,这一直不是推荐的模式。请使用 WorkManager
。或者,如果您无法采用 WorkManager
(因为它是 AndroidX 的一部分),请使用 JobScheduler
。在这两种方法中的任何一种中,您都可以摆脱第二个过程并大大简化您的通信。