2012-03-29 12 views
1

Ich habe ein Widget, das, wenn es gedrückt wird, eine Sendung sendet, die einen CountDownTimer startet, der mein Widget aktualisiert und am Ende einen Alarm abspielt. Das funktioniert wunderbar im Emulator.Wie kann ich sicherstellen, dass ein CountDownTimer aktiviert und abgeschlossen wird?

Auf meinem Handy ist es jedoch eine andere Geschichte. Mein Telefon ist so eingeschränkt, dass mein Prozess regelmäßig beendet wird, was natürlich bedeutet, dass der CountDownTimer mein Widget nicht mehr aktualisiert.

Es scheint, dass der einzige Weg, um in Zukunft zuverlässig Dinge zu tun, der AlarmManager ist, da dies einen Alarm auf Systemebene setzt. Die Dokumentation besagt jedoch, und ich stimme zu, dass Sie es nicht für Ticks verwenden sollen. Da jedoch alles andere, was Sie wahrscheinlich verwenden, die Möglichkeit hat, willkürlich heruntergefahren zu werden, geben Sie uns nicht wirklich viel Auswahl.

Meine Frage ist: Gibt es eine Möglichkeit, sicherzustellen, dass ein CountDownTimer tickt und schließlich onFinish() aufruft, oder muss ich es einfach fallen lassen und zu AlarmManager wechseln, und "missbrauche" es? Alle anderen Möglichkeiten, um sicherzustellen, dass das Ding funktioniert und endet, sind ebenfalls willkommen.

Ich sollte hinzufügen, dass ich nicht auf das Betriebssystem OnUpdate() aufrufen kann, sowohl weil es nicht schneller als alle 30 Minuten tun wird, und auch weil das Widget die meiste Zeit nichts tut. Nur wenn es angeklickt wird, tickt es jede Sekunde für eine Handvoll Minuten.

Antwort

0

Was ich getan habe, war von einem BroadcastReceiver zu einem Dienst zu bewegen. Nicht nur einen Dummy-Service zu verwenden, sondern einen echten Service zu verkörpern, was der BroadcastReceiver zuvor getan hat.

Da dies nicht garantiert, dass meine Timer nicht getötet werden, wird Android, falls gewünscht, automatisch versuchen, Ihren Dienst neu zu starten, nachdem er getötet wurde. In diesem Fall habe ich vor, einen Code zu haben, der den laufenden Zustand von der Festplatte wiederherstellt und fortsetzt.

0

Ich denke, das ist eine Lösung .. Erstellen Sie eine Dummy-Service ..

public class DummyService extends Service{ 


@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
    public void onCreate() { 
     super.onCreate(); 

    } 
    @Override 
    public void onDestroy() { 

     super.onDestroy(); 

    } 
} 

und starten Sie es von Ihrer Tätigkeit wie dies mit countdowntimer .. in oncreate der Aktivität

Intent intent = new Intent(this, DummyService.class); 
startService(intent); 

und Vergessen Sie auch nicht, diesen Service in Ihrem Manifest so zu deklarieren.

<service android:name=".DummyService" > 
</service> 

hoffe das hilft ..

+0

Was würde dies erreichen? –

+0

Dienste können jedoch trotzdem beendet werden. Außerdem ist die Sache, die den CountDownTimer hat, keine Aktivität, es ist ein BroadcastReceiver, aber vielleicht ist das egal. Wir würden den Service grundsätzlich als Anker nutzen. Ich weiß, was passieren würde. Die Kunden würden sich immer noch beschweren, dass der Countdown manchmal nicht funktioniert ... –

+0

Eigentlich könnte ein Service, der damit verbunden ist, das Ticket sein: http://stackoverflow.com/questions/3856767/android-keeping-a-background-service-alive-preventing-process-death –

0

Hinzufügen zu the accepted answer: von dem, was ich erinnere, lebt die BroadcastReceiver nur so lange wie es dauert, um die Sendung zu verarbeiten.

Das Starten eines Timers oder etwas aus dem BroadcastReceiver wird nicht funktionieren (wie angegeben).

Deshalb wird empfohlen, die BroadcastReceiver zu verwenden, um eine Service zu starten, die das Timing durchführt. Sicher, der Service kann immer noch getötet werden, aber nicht so früh wie die BroadcastReceiver.

Verwandte Themen