无法将 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
将起作用。
我有一个 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
将起作用。