2014-02-23 24 views
13

Ich habe einen Dienst, ich möchte eine Aufgabe jede Minute im Hintergrund ausführen. Es muss die Aufgabe nicht ausgeführt werden, wenn das Telefon schläft, nur wenn der Benutzer es aktiv verwendet. Ich versuche, dies mit einem IntentService zu tun, die wie folgt aufgebaut ist:Dienst, der jede Minute läuft

public class CounterService extends IntentService{ 

    public CounterService() { 
     super("CounterService"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return super.onStartCommand(intent,flags,startId); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Toast.makeText(this, "onhandleintent", Toast.LENGTH_SHORT).show(); 
     while(true) 
     { 
      //one minute is 60*1000 
      try { 
       Thread.sleep(5 * 1000); 
       Toast.makeText(getApplicationContext(), "getting app count", Toast.LENGTH_LONG).show(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Gerade jetzt die Funktionalität zu erhalten arbeite ich einfach will es alle 5 Sekunden einen Toast angezeigt werden, ich werde es später zu einer Minute ändern . Wenn ich die while(true) auskommentiert habe, dann wird die "onhandleintent" Nachricht angezeigt. Wenn ich jedoch den folgenden Code ausführen lasse, wird keiner der Toasts angezeigt. Wie kann ich das beheben?

+0

Betrachten Sie die Verwendung von PendingIntent und AlarmManager anstelle einer while-Schleife. Weitere Informationen finden Sie in den Dokumenten. Hier ist ein [SO-Beitrag] (http://stackoverflow.com/questions/3052149/using-alarmmanager-to-start-a-service-at-specific-time), der ein Beispiel zeigt. – Vino

Antwort

19

Dies wird eine Absicht zu Ihren Diensten ohne Verwendung irgendeine Prozessorzeit in Ihrer Aktivität in jede Minute senden zwischen

Intent myIntent = new Intent(context, MyServiceReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0); 

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 60); // first time 
    long frequency= 60 * 1000; // in ms 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), frequency, pendingIntent);   

anpassen MyServiceReceiver.class Ihr Ziel entsprechen Dienstleistung oder Tätigkeit

+1

Es sollte PendingIntent.getService statt PendingIntent.getBroadcast sein, um einen Dienst auszuführen. – Vistritium

3

Sie müssen den Haupt-Thread beenden, um das Risiko eines ANR zu vermeiden.

hinzufügen Statt einen Handler

Handler mHandler = new Handler(); 

... 

@Override 
protected void onHandleIntent(Intent intent) { 
    Toast.makeText(this, "onhandleintent", Toast.LENGTH_SHORT).show(); 
    mHandler.postDelayed(ToastRunnable, 5000); 
    //while(true) 
    //{ 

     //one minute is 60*1000 
     //try { 
     // Thread.sleep(5 * 1000); 
     // Toast.makeText(getApplicationContext(), "getting app count",   
     //Toast.LENGTH_LONG).show(); 
     //} catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
     // e.printStackTrace(); 
     //} 
    //} 
} 
final Runnable ToastRunnable = new Runnable(){ 
    public void run(){ 
     Toast.makeText(getApplicationContext(), "getting app count",   
       Toast.LENGTH_LONG).show(); 
     mHandler.postDelayed(ToastRunnable, 5000); 
    } 
} 
1

Do it wie diese

private void ping() { 
    try { 
     //Your code here or call a method 
    } catch (Exception e) { 
     Log.e("Error", "In onStartCommand"); 
     e.printStackTrace(); 
    } 
     scheduleNext(); 
    } 

    private void scheduleNext() { 
     mHandler.postDelayed(new Runnable() { 
     public void run() { ping(); } 
     }, 60000); 
    } 

    public int onStartCommand(Intent intent, int x, int y) { 
     mHandler = new android.os.Handler(); 
     ping(); 
     return START_STICKY; 
    } 
Verwandte Themen