无法将SyncBroadcast从SyncAdapter发送到Activity

问题描述 投票:0回答:1

我有一个运行良好的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?这样的相关问题

android android-syncadapter localbroadcastmanager
1个回答
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将工作。

© www.soinside.com 2019 - 2024. All rights reserved.