AlarmManager,BroadcastReceiver的和服务无法正常工作 [英] AlarmManager, BroadcastReceiver and Service not working
问题描述
我重构一些code,使我的应用程序将在一个特定的时间把数据从一天一个网站一次。从我的研究,这似乎是 AlarmManager
是最合适的方法。
我一直在下面的教程是:<一href="http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/">http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/
目前, AlarmManager
和的BroadcastReceiver
似乎工作,但是服务
似乎从来没有开始(即 onStartCommand
似乎并没有被调用)
下面是在code中的重要片段,我到目前为止有:
MyActivity.java
私人无效setRecurringAlarm(上下文的背景下){
日历更新时间= Calendar.getInstance();
updateTime.setTimeZone(TimeZone.getDefault());
updateTime.set(Calendar.HOUR_OF_DAY,20);
updateTime.set(Calendar.MINUTE,30);
意图下载=新的意图(背景下,AlarmReceiver.class);
downloader.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getBroadcast(背景下,0,下载,PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager =(AlarmManager)getSystemService(Context.ALARM_SERVICE);
//应该是AlarmManager.INTERVAL_DAY(但改为15分钟进行测试)
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,updateTime.getTimeInMillis(),AlarmManager.INTERVAL_FIFTEEN_MINUTES,pendingIntent);
Log.d(MyActivity,集alarmManager.setRepeating到:+ updateTime.getTime()的toLocaleString());
}
AlarmReceiver.java
公共类AlarmReceiver扩展的BroadcastReceiver {
@覆盖
公共无效的onReceive(上下文的背景下,意图意图){
意图dailyUpdater =新的意图(背景下,MyService.class);
context.startService(dailyUpdater);
Log.d(AlarmReceiver,叫context.startService从AlarmReceiver.onReceive);
}
}
MyService.java
公共类的MyService延伸服务{
@覆盖
公众诠释onStartCommand(意向意图,诠释标志,诠释startId){
Log.d(为MyService,关于执行MyTask的);
新MyTask的()执行()。
返回Service.START_FLAG_REDELIVERY;
}
@覆盖
公众的IBinder onBind(意向意图){
返回null;
}
私有类MyTask的扩展AsyncTask的&LT;字符串,太虚,布尔&GT; {
@覆盖
保护布尔doInBackground(字符串...字符串){
Log.d(为MyService - MyTask的,在MyTask的调用doInBackground);
返回false;
}
}
}
AndroidManifest.xml中
&lt;应用...&GT;
...
&LT;服务机器人:名称=为MyService&GT;&LT; /服务&GT;
&LT;接收器的Android版本:NAME =AlarmReceiver&GT;&LT; /接收器&GT;
&LT; /用途&gt;
当我触发如预期的 setRecurringAlarm
在 MyActivity
日志打印,同样,每15分钟日志从 AlarmReceiver
出现。不过,我从来没有看到日志从为MyService
(
是我在日志中看到示例:
DEBUG / MyActivity(688):设置alarmManager.setRepeating为:2012年1月29日下午8点三十〇分06秒
DEBUG / AlarmReceiver(688):调用context.startService从AlarmReceiver.onReceive
DEBUG / AlarmReceiver(688):调用context.startService从AlarmReceiver.onReceive
似乎无法找出什么我做错了 - 从<一个我的理解href="http://developer.android.com/reference/android/content/Context.html#startService%28android.content.Intent%29">Android开发文档的是,在 AlarmReceiver
当我打电话 context.startService(dailyUpdater)
应依次调用 onStartCommand
在为MyService
,尽管这似乎并不如此!
我是什么做错了,是造成为MyService
来根本无法启动?
想通了!
的MyService 应延长 IntentService 而不是服务!
通过这种变化,这也意味着,而不是覆盖了 onStartCommand
应覆盖 onHandleIntent
,而不是(见文档 IntentService )
所以的MyService 现在看起来是这样的:
公共类的MyService延伸IntentService {
公共则将MyService(){
超(服务名);
}
@覆盖
保护无效onHandleIntent(意向意图){
Log.d(为MyService,关于执行MyTask的);
新MyTask的()执行()。
}
私有类MyTask的扩展AsyncTask的&LT;字符串,太虚,布尔&GT; {
@覆盖
保护布尔doInBackground(字符串...字符串){
Log.d(为MyService - MyTask的,在MyTask的调用doInBackground);
返回false;
}
}
}
注:从文档中, onBind
返回默认执行空
所以没必要覆盖它<。 / P>
关于延长 IntentService
更多信息:<一href="http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService">http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService
I'm refactoring some code so that my app will pull data from a website once a day at a given time. From my research, it seems like AlarmManager
is the most appropriate approach.
The tutorial I have been following is: http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/
So far, AlarmManager
and the BroadcastReceiver
seem to be working, however the Service
never seems to start (ie. onStartCommand
doesn't seem to be called)
Here are the important snippets of the code I have so far:
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>
When I trigger the setRecurringAlarm
in MyActivity
the log prints as expected, similarly, every 15min the log from AlarmReceiver
appears. However, I never see the log from MyService
:(
Example of what I see in the logs:
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
Can't seem to figure out what I've done wrong - my understanding from the Android Dev Docs is that in AlarmReceiver
when I call context.startService(dailyUpdater)
that should in turn call onStartCommand
in MyService
, though that doesn't seem to be the case!
What am I doing wrong that is causing MyService
to not start at all?
Figured it out!
MyService should be extending IntentService instead of Service!
With this change, it also means that instead of overriding onStartCommand
should be overriding onHandleIntent
instead (see docs on IntentService)
So MyService now looks like this:
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;
}
}
}
Note: From the docs, the default implementation of onBind
returns null
so no need to override it.
More information about extending IntentService
: http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService
这篇关于AlarmManager,BroadcastReceiver的和服务无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!