私のアプリが特定の時間に1日に1回ウェブサイトからデータを取得するように、いくつかのコードをリファクタリングしています。私の研究からは、AlarmManager
が最も適切なアプローチだと思われます。AlarmManager、BroadcastReceiver、およびService not working
私は、次のされているチュートリアルでは、次のとおりです。これまでのところ、AlarmManager
とBroadcastReceiver
が働いているように見えるhttp://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/
、しかしService
が開始するようだ決して
onStartCommand
が呼び出されていないようです。)
ここでは、コードの重要なスニペットは、私がこれまで持っています:
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;
}
}
}
私はTRのAndroidManifest.xml
<application ...>
...
<service android:name="MyService"></service>
<receiver android:name="AlarmReceiver"></receiver>
</application>
setRecurringAlarm
がMyActivity
になると、ログが期待通りに印刷されます。同様に、15分ごとにAlarmReceiver
のログが表示されます。私の理解Android Dev Docsから -
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
は私が間違って何をやったかを見つけ出すように見えることはできません。しかし、私は私がログに見るもののMyService
:(
例からログを見ることはありませんAlarmReceiver
に私はそれが事実ではないようですが、MyService
でターンコールonStartCommand
にすべきcontext.startService(dailyUpdater)
を呼び出すときということです!
私はMyService
は全く?
+1のおかげで、あなたのコードあなたはまた、アラームに応じてサービスを開始する非自明wakelock行動に実行している – Nirali
..私を助けて。提案のためのhttp://stackoverflow.com/questions/25852309/does-alarmmanager-require-the-pendingintent-to-be-of-type-broadcastreceiver – ctate