我正在开发一个在xamarin.android中的无障碍服务。 一切都很好,但我想在服务上添加广播接收器。 我知道我必须从广播接收器派生我的无障碍服务,但这是不可能的,因为该服务已经从Android.AccessibilityService派生。 实际上,问题在于,当用户在主活动上进行某些配置更改时,我希望触发一个广播接收器,而我的无障碍服务应该监听此广播接收器。 所以,有什么建议吗?
我正在开发一个在xamarin.android中的无障碍服务。 一切都很好,但我想在服务上添加广播接收器。 我知道我必须从广播接收器派生我的无障碍服务,但这是不可能的,因为该服务已经从Android.AccessibilityService派生。 实际上,问题在于,当用户在主活动上进行某些配置更改时,我希望触发一个广播接收器,而我的无障碍服务应该监听此广播接收器。 所以,有什么建议吗?
在你的 Service
中,定义一个内部类 BroadcastReceiver
,在你的 Service
构造函数中创建并注册这个 BroadcastReceiver
。
Service
嵌入 BroadcastReceiver
示例:[Service(Label = "StackOverflowService")]
[IntentFilter(new String[] { "com.yourpackage.StackOverflowService" })]
public class StackOverflowService : Service
{
public const string BROADCASTFILTER = "com.yourpackage.intent.action.IMAGEOPTIMIZER";
IBinder binder;
StackOverflowServiceBroadcastReceiver broadcastReceiver;
public StackOverflowService()
{
broadcastReceiver = new StackOverflowServiceBroadcastReceiver(this);
RegisterReceiver(broadcastReceiver, new IntentFilter(BROADCASTFILTER));
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
return StartCommandResult.NotSticky;
}
public override IBinder OnBind(Intent intent)
{
binder = new StackOverflowServiceBinder(this);
return binder;
}
[IntentFilter(new[] { BROADCASTFILTER })]
class StackOverflowServiceBroadcastReceiver : BroadcastReceiver
{
StackOverflowService service;
public StackOverflowServiceBroadcastReceiver(StackOverflowService service) : base()
{
this.service = service;
}
public override void OnReceive(Context context, Intent intent)
{
var stack = intent.GetStringExtra("Stack");
Log.Debug("SO", $"{BROADCASTFILTER} Received : {stack}");
// access your service via the "service" var...
}
}
}
public class StackOverflowServiceBinder : Binder
{
readonly StackOverflowService service;
public StackOverflowServiceBinder(StackOverflowService service)
{
this.service = service;
}
public StackOverflowService GetStackOverflowService()
{
return service;
}
}
var intentForService = new Intent(StackOverflowService.BROADCASTFILTER)
.PutExtra("Stack", "Overflow");
Application.Context.SendBroadcast(intentForService);