AlarmManager,BroadcastReceiver的和服务无法正常工作

编程入门 行业动态 更新时间:2024-10-24 22:20:16
本文介绍了AlarmManager,BroadcastReceiver的和服务无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我重构一些code,使我的应用程序将在一个特定的时间把数据从一天一个网站一次。从我的研究,这似乎是 AlarmManager 是最合适的方法。

我一直在下面的教程是:mobile.tutsplus/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的<字符串,太虚,布尔> {         @覆盖         保护布尔doInBackground(字符串...字符串){             Log.d(为MyService - MyTask的,在MyTask的调用doInBackground);             返回false;         }     } }

AndroidManifest.xml中

<应用...>     ...     <服务机器人:名称=为MyService>< /服务>     <接收器的Andr​​oid版本:NAME =AlarmReceiver>< /接收器> < /用途>

当我触发如预期的 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

似乎无法找出什么我做错了 - 从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的<字符串,太虚,布尔> {         @覆盖         保护布尔doInBackground(字符串...字符串){             Log.d(为MyService - MyTask的,在MyTask的调用doInBackground);             返回false;         }     } }

注:从文档中, onBind 返回默认执行空所以没必要覆盖它

关于延长 IntentService 更多信息:developer.android/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: mobile.tutsplus/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: developer.android/guide/topics/fundamentals/services.html#ExtendingIntentService

更多推荐

AlarmManager,BroadcastReceiver的和服务无法正常工作

本文发布于:2023-11-27 04:33:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1636610.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:无法正常   和服务   工作   AlarmManager   BroadcastReceiver

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!