2016-09-02 3 views
0

ich möchte alle 5 Minuten eine Aufgabe ausführen. Ich habe versucht, es mit einem IntentService und Alarmmanager zu lösen, mein Code:C# -> Android (Xamarin) -> Aufgabe alle 5 Minuten im Hintergrund starten

protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle); 
    SetContentView(Resource.Layout.Main); 

    var tkrServiceIntent = new Intent(this, typeof(GpsDataHandler)); 
    var tkrServicePendingIntent = PendingIntent.GetService(this, 0, tkrServiceIntent, 0); 

    long interval = 5000; 
    var firstStart = (DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond) + 1000; 

    var am = (AlarmManager)GetSystemService(Context.AlarmService); 

    am.SetInexactRepeating(AlarmType.RtcWakeup, firstStart, interval, tkrServicePendingIntent); 

    Toast.MakeText(this, "Service started", ToastLength.Long).Show(); 
} 

i erhalten den Toast, dass der Dienst gestartet wird, aber wenn ich in laufenden Dienste suchen, gibt es keinen Service für meine Anwendung. Kannst du mir sagen, wo das Problem liegt?

+0

Haben Sie überprüft, ob Sie den Toast erhalten, wenn die App im Hintergrund ist oder nachdem sie getötet wurde? –

+0

@ Hari_krish4 wie kann ich es testen? – Saiirex

+0

Wenn Ihr Dienst läuft, wird Ihre Toast-Nachricht unten auf Ihrem Gerät angezeigt. –

Antwort

0

IntentService in einer "Aktivität" (wenn wir es so nennen kann) in Hintergrund der App runing, so finnally wird es nennen die OnDestroy() .. Sie können den Timer verwenden, um Ihr Problem zu beheben, wie:

using System; 
using System.Threading; 

class TimerExampleState { 
    public int counter = 0; 
    public Timer tmr; 
} 

class App { 
    public static void Main() { 
    TimerExampleState s = new TimerExampleState(); 

    // Create the delegate that invokes methods for the timer. 
    TimerCallback timerDelegate = new TimerCallback(CheckStatus); 

    // Create a timer that waits one second, then invokes every second. 
    Timer timer = new Timer(timerDelegate, s, 1000, 1000); 

    // Keep a handle to the timer, so it can be disposed. 
    s.tmr = timer; 

    // The main thread does nothing until the timer is disposed. 
    while (s.tmr != null) 
     Thread.Sleep(0); 
    Console.WriteLine("Timer example done."); 
    } 
    // The following method is called by the timer's delegate. 

    static void CheckStatus(Object state) { 
    TimerExampleState s = (TimerExampleState) state; 
    s.counter++; 
      Console.WriteLine("{0} Checking Status {1}.",DateTime.Now.TimeOfDay, s.counter); 
     if (s.counter == 5) { 
     // Shorten the period. Wait 10 seconds to restart the timer. 
     (s.tmr).Change(10000,100); 
     Console.WriteLine("changed..."); 
    } 
     if (s.counter == 10) { 
     Console.WriteLine("disposing of timer..."); 
     s.tmr.Dispose(); 
     s.tmr = null; 
    } 
    } 
} 

Quelle: https://developer.xamarin.com/api/type/System.Threading.Timer/

-1

Erstellen Sie eine Serviceklasse. Rufen Sie die DoWork-Methode in der OnStartCommand-Methode auf. Überprüfen Sie, ob das Protokoll alle 5 Sekunden gedruckt wird.

public void DoWork() 
      { 
       var t = new Thread(() => 
       { 
        while (true) 
        { 
         Log.Debug("Service", "Service running");  
         Thread.Sleep(5000); 
        } 
       }); 
       t.Start(); 
      } 
+0

Eigentlich ist das (http://www.whatthedroid.de/2011/10/hintergrundprocesses-in-android-teil-1-started-services/) genau das was ich brauche, aber in Java. Ich habe versucht, es in C# zu übersetzen. – Saiirex

Verwandte Themen