无法将 sendBroadcast 从 SyncAdapter 发送到 Activity

Unable to send sendBroadcast from SyncAdapter to Activity

我有一个 SyncAdapter 运行良好的应用程序。 SyncService 每小时运行一次。

我的应用程序有一个名为 DeviceControlActivity 的主 FragmentActivity,我想从 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);

此侦听器按预期报告同步 activity。

但我想使用 LocalBroadcastManager 在服务和 Activity 之间进行通信,但我做不到。

我已经查看了相关问题,例如 How to use LocalBroadcastManager?

根据 LocalBroadcastManager 文档,此 class 是一个 Helper,用于在您的进程中向本地对象注册并发送 Intent 广播[=34] =].

如果 <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 将起作用。