我有一个运行良好的SyncAdapter
应用程序。 SyncService
每小时运行一次。
我的应用程序有一个名为FragmentActivity
的主要DeviceControlActivity
,我想从SyncAdaptor接收消息,例如syncResult
。
我已经尝试了很多来启动和运行,但我无法从DeviceControlActivity
收到有关SyncAdapter
的任何消息。
在我的DeviceControlActivity
我做:
private BroadcastReceiver mSyncMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Got it!");
}
};
@Override
protected void onResume() {
super.onResume();
// Receive feedback from syncManager
LocalBroadcastManager.getInstance(getApplication()).registerReceiver(mSyncMessageReceiver,
new IntentFilter(Constants.MESSAGE_SYNC));
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mSyncMessageReceiver);
}
在SyncAdapter上,我有:
private LocalBroadcastManager mBroadcastManager;
public SyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
mBroadcastManager = LocalBroadcastManager.getInstance(context);
}
@Override
public void onPerformSync(
Account account,
Bundle extras,
String authority,
ContentProviderClient provider,
SyncResult syncResult) {
Intent intent = new Intent(Constants.MESSAGE_SYNC);
mBroadcastManager.sendBroadcast(intent);
我可以从DeviceControlActivity
发送消息到它自己,它的工作原理。
我可以从SyncService接收消息,但使用另一种方式:
final int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
mSyncMonitor = ContentResolver.addStatusChangeListener(mask, this);
此侦听器按预期报告同步活动。
但我想使用LocalBroadcastManager在服务和活动之间进行通信,但我无法做到。
我已经检查过像How to use LocalBroadcastManager?这样的相关问题
根据LocalBroadcastManager文档,此类是一个帮助程序,用于注册并向您的进程中的本地对象发送Intent广播。
如果<service>
在不同的进程上运行,上面的例子就不起作用了。
AndroidManifest.xml
是:
<service
android:name=".sync.SyncService"
android:exported="true"
android:process=":sync">
这是Creating a Sync Adapter建议的方式。
如果我们将<service>
声明更改为:
<service
android:name=".sync.SyncService"
android:exported="true">
删除android:process
属性,SyncService
将在同一过程中运行,LocalBroadcastManager
将工作。