如何在Xamarin android中实现服务

时间:2017-10-19 01:19:31

标签: android xamarin mqtt

使用Xamarin和Mqtt以及我的mqtt客户端m2mqtt无法在整个android生命周期中维持连接。

如果您的进程需要在活动暂停或停止后保持活动状态(手机休眠,用户切换应用程序然后返回),则活动生命周期将导致问题

使用服务的想法是,无论活动在生命周期中的哪个位置,它都将保持不变。

任何人都可以告诉我如何实施服务。

1 个答案:

答案 0 :(得分:1)

行,

这很容易而且非常酷。

我在这里得到了我需要的信息c# corner

很多时候,当我需要一个外行人的描述csharp角落也不错我用他们的例子非常接近他们描绘的方式我只是想帮助你理解如何使用它

你需要3个班级 1.服务本身(我们称之为服务) 2.服务活页夹(serviceBinder) 3.服务连接(serviceConnection)

我会告诉你我的下一个(这是有效的),我正在设计一个绑定服务,因此你会在名称而不是服务中看到它被称为boundService。但是,在执行此操作后,我发现启动服务的工作方式与启动服务的方式完全相同,但类不同。

你需要android.app。

首先我们需要它扩展的服务:服务(重要)

using Android.App

[Service]
class MqttBoundService : Service
{
    private MqttBoundServiceBinder binder;
    public override void OnCreate()
    {
        base.OnCreate();
    }
    public override IBinder OnBind(Intent intent)
    {
        binder = new MqttBoundServiceBinder(this);
        Toast.MakeText(this, "OnBind() method start from BoundService", ToastLength.Long).Show();
        Toast.MakeText(this, "Bound Service is started", ToastLength.Long).Show();
        return binder;
    }
    public override bool OnUnbind(Intent intent)
    {
        Toast.MakeText(this, "OnUnBind() Method Called from BoundService.cs", ToastLength.Long).Show();
        return base.OnUnbind(intent);
    }
    public override void OnDestroy()
    {
        Toast.MakeText(this, "Bound Service Destroyed", ToastLength.Long).Show();
        base.OnDestroy();
    }

敬酒就在那里,所以你知道发生什么事,以防你的服务在你不想要的时候被摧毁。

好了,现在我们需要服务活页夹(Extends Binder重要)

  class MqttBoundServiceBinder : Binder
{
    MqttBoundService service;
    public MqttBoundServiceBinder(MqttBoundService service)
    {
        this.service = service;
    }
}

现在我们需要连接,这是繁重的举动。我还是新手,但看起来你想把这些方法放在需要比活动生命周期更长的时候。

class MqttBoundServiceConnection : Java.Lang.Object, IServiceConnection
{
    public Connection connect { get; private set; }


    public void OnServiceConnected(ComponentName name, IBinder service)
    {
        Console.WriteLine("OnServiceConnected() Method called");


    }
    public void OnServiceDisconnected(ComponentName name)
    {
        Console.WriteLine("OnServiceDisConnected() Method called");
    }

    public Connection Connect()
    {
        connect = new Connection(Utility.data, Utility.cdata);
        return connect;
    }


}

在Connect I实例化我的Connection对象的方法中,这里的参数是安全证书,但这并不重要。我也有一个属性get;组;我设置为我的对象,所以我可以在我的活动的OnRestart()和OnResume()函数中访问mqtt连接。

在我做这件事之前,我遇到了被android转移资源的问题,现在不会发生。

不确定是否重要,但这是我的OnRestart()

if (serviceConnection.connect == null)
        {
            DoBindService();
            connect = serviceConnection.Connect();
        }
        else
        {
            connect = serviceConnection.connect;
        }

哦,我忘了怎么告诉你如何启动它对我来说没关系我正在进行绑定服务这意味着在使用它的所有活动(或客户端)被销毁之后,服务就会被破坏。

因此,要启动绑定服务,首先要为连接创建一个类级别变量(在活动中 - 它在上面的OnStart()中引用)。一旦你这样做,你可以从这个类调用方法(真的很酷)

MqttBoundServiceConnection serviceConnection = new mqttBoundServiceConnection();

然后我们需要一个名为DoBindService

的活动中的方法
private void DoBindService()
    {
        var BoundServiceIntent = new Intent(this, typeof(MqttBoundService));
        BindService(BoundServiceIntent, serviceConnection, Bind.AutoCreate);
    }

在OnCreate()中添加活动

DoBindService();

我希望这能帮助我一旦找到它的人帮助我:)