C# Android:在服务上获取广播接收器? [英] C# Android: Get Broadcast Receiver on a service?

查看:34
本文介绍了C# Android:在服务上获取广播接收器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在 xamarin.android 中开发无障碍服务.一切都很好,但我想要服务上的广播接收器.我知道我必须从广播接收器派生我的无障碍服务,但这是不可能的,因为该服务已经派生自 Android.AccessibilityService.实际上,问题是,当用户对主要活动进行一些配置更改时,我想提高一个广播接收器,我的无障碍服务应该监听它.那么,对此有什么想法吗?

I'm developing an accessibility service in xamarin.android. all is fine, but I want the broadcast receiver on the service. I know that I'll have to derive my accessibility service from broadcast receiver, but it's not possible because the service is already derived from Android.AccessibilityService. actually, the thing is that, when user does some configuration change on main activity, I want to raise an broadcast receiver for which, my accessibility service should listen. So, any ideas for this?

推荐答案

在你的 Service 中,定义一个 BroadcastReceiver 内部类和你的 Service> 构造函数 创建和注册 BroadcastReceiver.

Within your Service, define an BroadcastReceiver inner class and within your Service constructor create and register the 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);

这篇关于C# Android:在服务上获取广播接收器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆