我在自己的“活动”和“服务”之间注册了broadcastReceiver
时遇到了问题,这是在清单中的另一个进程中定义的。
我尝试了其他一些技巧,例如使用handlers
或ContentProvider
进行通信,但没有按我预期的那样工作,实际上我想连续获取数据。
这是我在服务中的代码:
Intent locationIntent = new Intent("LocationIntent");
locationIntent.setAction("updatedLocations");
locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
locationIntent.putExtra("list",updatedList);
sendBroadcast(locationIntent);
我将其注册到我的活动的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!
,该日志在接收器中定义,但不起作用。
那么,在另一个process
中定义的Activity和Service之间进行通信并连续获取数据的最佳方法是什么?
注意:我的服务从服务器获取数据,但是服务器不是实时的,因此我通过使用handlers
定期向服务器请求数据来检查数据。
答案 0 :(得分:1)
但这不起作用
这是因为您过度指定了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);
但是请注意,任何应用程序都可以收听此广播。考虑在setPackage()
上使用Intent
来限制向您自己的应用程序的交付。
在另一个流程中定义的Activity和Service之间进行通信并连续获取数据的最佳方法是什么?
如果我被迫进行流程分离,我会考虑使用Messenger
。
我的服务从服务器获取数据,但服务器不是实时的,因此我通过使用处理程序定期向服务器请求来检查数据。
多年来,这不是推荐的模式。请使用WorkManager
。或者,如果您不适合采用JobScheduler
(因为它是AndroidX的一部分),请使用WorkManager
。无论采用哪种方法,您都可以摆脱第二个过程,从而大大简化了沟通。