AlarmManager,BroadcastReceiver的和服务无法正常工作 [英] AlarmManager, BroadcastReceiver and Service not working

查看:168
本文介绍了AlarmManager,BroadcastReceiver的和服务无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我重构一些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;接收器的Andr​​oid版本: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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆