2015-05-13 12 views
5

Ho una applicazione basata su XamarinForms.Passare i dati dal servizio Android a ContentPage in Xamarin Applicazione basata su modulo

Un servizio di background che ho creato nel progetto Android e quel servizio vorrebbe inviare dati a ContentPage (che è in PCL) che viene visualizzato all'utente.

Come è possibile passare i dati a ContentPage (dal progetto xx.Droid al PCL)?

Una soluzione è:

  • Per creare classe PCL con variabile statica, che sarà accessibile da progetto xxx.Droid (per esempio var TEMP_VAR.).
  • Valore di aggiornamento di tale variabile statica (TEMP_VAR) dalla classe di servizio dal progetto xxx.Droid.
  • È necessario creare un Notifier su tale variabile statica (TEMP_VAR)
  • Aggiornare la pagina del contenuto utilizzando il meccanismo MessageCenter se richiesto.

Se c'è una soluzione migliore, potresti fornirmi per favore?

risposta

5

questo può essere realizzato utilizzando il concetto di C#

  • servizio di dipendenza
  • Evento

Necessità di avere 4 classi per tale applicazione:

  1. interfaccia in PCL (es. CurrentLocationService.cs) con gestori di eventi definiti in esso.

namespace NAMESPACE 
 
{ 
 
\t public interface CurrentLocationService 
 
\t { 
 
\t \t void start(); 
 

 
\t \t event EventHandler<PositionEventArgs> positionChanged; 
 
\t } 
 
}

  1. Attuazione di interfaccia del PCL a progetto xxx.Droid (ad es CurrentLocationService_Android.cs) utilizzando il servizio di dipendenza

class CurrentLocationService_Android : CurrentLocationService 
 
{ 
 

 
\t public static CurrentLocationService_Android mySelf; 
 

 
\t public event EventHandler<PositionEventArgs> positionChanged; 
 
\t 
 
\t 
 
\t public void start() 
 
\t { 
 
\t \t mySelf = this; 
 
\t \t Forms.Context.StartService(new Intent(Forms.Context, typeof(MyService))); 
 

 
\t } 
 

 
\t public void receivedNewPosition(CustomPosition pos) 
 
\t { 
 
\t \t positionChanged(this, new PositionEventArgs(pos)); 
 
\t } 
 

 
}

  1. ContentPage in PCL - che avrà oggetto di implementazione dell'interfaccia. oggetto può essere ottenuto

public CurrentLocationService LocationService 
 
{ 
 
\t get 
 
\t { 
 
\t \t if(currentLocationService == null) 
 
\t \t { 
 
\t \t \t currentLocationService = DependencyService.Get<CurrentLocationService>(); 
 
\t \t \t currentLocationService.positionChanged += OnPositionChange; 
 
\t \t } 
 
\t \t return currentLocationService; 
 
\t } 
 
    
 

 
} 
 

 
private void OnPositionChange(object sender, PositionEventArgs e) 
 
{ 
 
\t Debug.WriteLine("Got the update in ContentPage from service "); 
 
}

    servizio
  1. Background in progetto xxx.Droid. Questo servizio avrà riferimento all'implementazione del servizio di dipendenza CurrentLocationService.cs

[Service] 
 
    public class MyService : Service 
 
    { 
 
     public string TAG = "MyService"; 
 
     
 
     public override IBinder OnBind(Intent intent) 
 
     { 
 
      throw new NotImplementedException(); 
 
     } 
 

 
     
 

 
     public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId) 
 
     { 
 
      Log.Debug(TAG, TAG + " started"); 
 

 
      doWork(); 
 

 
      return StartCommandResult.Sticky; 
 
     } 
 

 
     public void doWork() 
 
     { 
 
      var t = new Thread(
 
       () => 
 
       { 
 
        Log.Debug(TAG, "Doing work"); 
 
        Thread.Sleep(10000); 
 
        Log.Debug(TAG, "Work completed"); 
 

 
        if(CurrentLocationService_Android.mySelf != null) 
 
        { 
 
         CustomPosition pos = new CustomPosition(); 
 
         pos.update = "Finally value is updated"; 
 
         CurrentLocationService_Android.mySelf.receivedNewPosition(pos); 
 
         
 
        } 
 

 
        StopSelf(); 
 
       }); 
 
      t.Start(); 
 
     } 
 

 
    }

Nota: PositionEventArgs classe ha bisogno di essere creato come per l'uso di trasmettere dati tra servizi e ContentPage.

Questo funziona per me come il fascino.

Spero che questo ti sia utile.