我有一个运行良好的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在服务和活动之间进行通信,但我不能。
等相关问题答案 0 :(得分:1)
根据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
将有效。