无法将SyncBroadcast从SyncAdapter发送到Activity

时间:2017-12-19 19:32:05

标签: android android-syncadapter localbroadcastmanager

我有一个运行良好的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?

等相关问题

1 个答案:

答案 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将有效。