13

Uygulamam, belirli bir saatte bir günde bir web sitesinden veri alabilmem için bazı kodları yeniden onaylıyorum. Araştırmamdan, AlarmManager en uygun yaklaşım gibi görünüyor.AlarmManager, BroadcastReceiver ve Service çalışmıyor

ben takip ediyorum öğretici geçerli:

http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/ Şimdiye kadar, AlarmManager ve BroadcastReceiver ancak Service asla başlamak gibi görünüyor, çalışıyor gibi görünüyor (. Yani onStartCommand çağrılacak görünmüyor)

İşte kodun önemli parçacıkları var bugüne kadar şunlardır:

MyActivity.java

private void setRecurringAlarm(Context context) { 
    Calendar updateTime = Calendar.getInstance(); 
    updateTime.setTimeZone(TimeZone.getDefault()); 
    updateTime.set(Calendar.HOUR_OF_DAY, 20); 
    updateTime.set(Calendar.MINUTE, 30); 

    Intent downloader = new Intent(context, AlarmReceiver.class); 
    downloader.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, downloader, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    // should be AlarmManager.INTERVAL_DAY (but changed to 15min for testing) 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent); 
    Log.d("MyActivity", "Set alarmManager.setRepeating to: " + updateTime.getTime().toLocaleString()); 
} 

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent dailyUpdater = new Intent(context, MyService.class); 
     context.startService(dailyUpdater); 
     Log.d("AlarmReceiver", "Called context.startService from AlarmReceiver.onReceive"); 
    } 
} 

MyService.java

public class MyService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d("MyService", "About to execute MyTask"); 
     new MyTask().execute(); 
     return Service.START_FLAG_REDELIVERY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    private class MyTask extends AsyncTask<String, Void, boolean> { 
     @Override 
     protected boolean doInBackground(String... strings) { 
      Log.d("MyService - MyTask", "Calling doInBackground within MyTask"); 
      return false; 
     } 
    } 
} 

I tr AndroidManifest.xml

<application ...> 
    ... 
    <service android:name="MyService"></service> 
    <receiver android:name="AlarmReceiver"></receiver> 
</application> 

MyActivity'da setRecurringAlarm'u bekletme, günlük yazdırmayı beklendiği şekilde beklendiği gibi, her 15 dakikada bir AlarmReceiver günlüğünde görünür. Ancak, ben günlüklerine bakın ne MyService :(

Örnek dan günlüğünü görmek asla:

DEBUG/MyActivity(688): Set alarmManager.setRepeating to: Jan 29, 2012 8:30:06 PM 
DEBUG/AlarmReceiver(688): Called context.startService from AlarmReceiver.onReceive 
DEBUG/AlarmReceiver(688): Called context.startService from AlarmReceiver.onReceive 

ben yanlış yaptığımı anlamaya görünüyor olamaz - benim anlayış Android Dev Docs dan Ben context.startService(dailyUpdater) çağırdığınızda AlarmReceiver o dönüş çağrısında MyService yılında onStartCommand, bu durumda olması görünmüyor gerektiğini olsa o!

yanlış olduğunu yapıyorum hiç?

01 başlamaması için MyService neden oluyor
+0

1 teşekkürler kod help me .. – Nirali

+0

. Http://stackoverflow.com/questions/25852309/does-alarmmanager-require-the-pendingintent-to-be-of-type-broadcastreceiver – ctate

cevap

15

Figured out out!

MyServiceIntentService yerine Servisi uzanan edilmelidir!

public class MyService extends IntentService { 

    public MyService() { 
     super("MyServiceName"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.d("MyService", "About to execute MyTask"); 
     new MyTask().execute(); 
    } 

    private class MyTask extends AsyncTask<String, Void, boolean> { 
     @Override 
     protected boolean doInBackground(String... strings) { 
      Log.d("MyService - MyTask", "Calling doInBackground within MyTask"); 
      return false; 
     } 
    } 
} 

Not: Bu değişiklikle birlikte

, o da yerine onStartCommand geçersizleştirebilir onHandleIntent yerine şimdi şöyle

Yani MyService (IntentService üzerinde doküman bakınız) ağır basan olması gerektiği anlamına gelir : Dokümanlardan, onBind'un varsayılan uygulaması, null değerini döndürerek, geçersiz kılmaya gerek kalmaz. IntentService uzanan yaklaşık

fazla bilgi: Ayrıca alarmlar cevaben hizmet başlama belli olmayan bir Uyandırma kilidi davranış içine koşuyoruz http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService

+1

+1 Teşekkürler kodunuz bana yardımcı oldu – Nirali

+1

+1 Teşekkürler! "Hizmet" sınıfı Android 4.x cihazlar üzerinde sadece iyi çalışıyor ancak Android 2.x cihazlarda neden çalışmadığını göremedim.İntenservis'e geçerken cazibe gibi çalıştı. –

0

Eğer bu gibi niyet değiştirirseniz AlarmManager, bir BroadcastReceiver geçmekte yerine hemen Hizmetleri çalıştırmak için alabilir:

//Change the intent 
Intent downloader = new Intent(context, MyService.class); 
    downloader.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

//Change to getService() 
PendingIntent pendingIntent = PendingIntent.getService(context, 0, downloader, PendingIntent.FLAG_CANCEL_CURRENT); 

Bu sorunu çözebilir! Bunun yerine

Intent dailyUpdater = new Intent(this, MyService.class);

diğer öneri

Intent dailyUpdater = new Intent(context, MyService.class);

kullanımı kullanarak

+0

adresindeki cevaplarda bazı ayrıntılar ve öneriler var. Öneri için teşekkürler - Bunu denedim önce (downloader.addFlags olmadan) ve işe yaramadı - addFlags ile deneyin ve yardımcı olup olmadığını görün! Sadece acaba Servis'i doğrudan çalıştırabiliyorsanız neden 'BroadcastReceiver' var? – pyko

+0

Bu değişikliği denedim - işe yaramadı :(ayrıca 'içerik' değişimini denedim, bu da kumarın önerdiği gibi… hayır şansı da yok! – pyko

0

alarmdan yerine bir yayın gönderme ve yayın alıcısı olarak hizmet başlayan daha direkt olarak hizmet başlamaktır.

+0

downloader.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK) olmadan ur kodunu denediniz mi? –

+0

merhaba kumar, evet ben de 'addFlags' olmadan denedim inanıyorum, ya da işe yaramadı. – pyko