Tôi đang tái cấu trúc một số mã để ứng dụng của tôi sẽ lấy dữ liệu từ một trang web một lần một ngày tại một thời điểm nhất định. Từ nghiên cứu của tôi, có vẻ như AlarmManager
là cách tiếp cận thích hợp nhất.AlarmManager, BroadcastReceiver và Dịch vụ không hoạt động
Các hướng dẫn, tôi đã theo là: http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/
Cho đến nay, AlarmManager
và BroadcastReceiver
dường như làm việc, tuy nhiên Service
bao giờ dường như bắt đầu (. Tức là onStartCommand
dường như không được gọi)
Dưới đây là các đoạn quan trọng của mã tôi có cho đến nay:
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;
}
}
}
AndroidManifest.xml
<application ...>
...
<service android:name="MyService"></service>
<receiver android:name="AlarmReceiver"></receiver>
</application>
Khi tôi tr igger setRecurringAlarm
trong MyActivity
bản ghi nhật ký như mong đợi, tương tự, cứ mỗi 15 phút nhật ký xuất hiện từ AlarmReceiver
sẽ xuất hiện. Tuy nhiên, tôi không bao giờ nhìn thấy các bản ghi từ MyService
:(
Ví dụ về những gì tôi nhìn thấy trong các bản ghi:
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
dường như không thể tìm ra những gì tôi đã làm sai - hiểu biết của tôi từ Android Dev Docs được rằng trong AlarmReceiver
khi tôi gọi context.startService(dailyUpdater)
rằng trong cuộc gọi lần lượt onStartCommand
trong MyService
, mặc dù điều đó dường như không nên là trường hợp!
tôi đang làm gì sai đó gây ra MyService
để không bắt đầu
1 Cảm ơn mã của bạn giúp tôi .. – Nirali
Bạn cũng đang chạy vào một hành vi wakelock không rõ ràng bắt đầu các dịch vụ để đáp ứng với báo động. Có một số chi tiết và đề xuất trong các câu trả lời tại http://stackoverflow.com/questions/25852309/does-alarmmanager-require-the-pendingintent-to-be-of-type-broadcastreceiver – ctate