2017-10-19 118 views
-2

使用Xamarin和Mqtt和我的mqtt客戶端m2mqtt無法在整個android生命週期中保持連接。如何在Xamarin中實現一個服務android

活動,如果你的程序需要活着的活動已暫停或停止後的生命週期會導致問題(手機睡覺,用戶切換應用程序,然後回來)

使用服務的想法是,它會保持無論活動在生命週期中的哪個位置都是完整的。

任何人都可以告訴我如何實現一項服務。

回答

0

OK,

這很容易,真正的那種很酷。

我得到了我需要的時候,我需要一個外行人的描述csharp的角落是不壞我用自己的例子非常接近,他們是如何塑造它,我只是想弄清楚這一點,這裏c# corner

了很多次的信息幫助您瞭解如何使用它

需要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(); 
    } 

的麪包是有隻是讓你知道什麼時候在你不希望它太您的服務已被破壞掉了的情況下發生的。

好了,現在我們需要的服務粘結劑(擴展粘結劑重要)

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; 
    } 


} 

在方法連接我實例化我的連接對象這裏的參數是安全證書,但這並不重要。我也有一個財產與得到;組;我將其設置爲我的對象,以便可以訪問我的活動的OnRestart()和OnResume()函數中的mqtt連接。

在我這樣做之前,我曾經遇到了資源被android轉移的問題,現在並沒有發生。

不知道它的問題,但是這是我的OnRestart()

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

哦,我忘了怎麼告訴你如何啓動就OK了我,我在做一個綁定的服務,這意味着所有的活動後, (或客戶端)正在使用它被銷燬服務被破壞。

所以要啓動一個綁定的服務,首先爲連接創建一個類級別的變量(在活動中 - 它在上面的OnStart()中被引用)。此外,一旦你這樣做,你可以調用這個類的方法(很酷)

MqttBoundServiceConnection serviceConnection = new mqttBoundServiceConnection(); 

然後我們需要在一個名爲DoBindService

private void DoBindService() 
    { 
     var BoundServiceIntent = new Intent(this, typeof(MqttBoundService)); 
     BindService(BoundServiceIntent, serviceConnection, Bind.AutoCreate); 
    } 

在OnCreate(活性的方法)爲活動添加

DoBindService(); 

我希望這個幫助別人是幫了我一次,我想通了:)