IntentService не запускается в определенных ситуациях

У меня проблема. Время от времени IntentService UpdateService02 не запускается. Я поместил записи журнала, чтобы я мог отладить, и вот что я получаю...

02-28 21:37:32.461: Основной - Широковещательная рассылка отправлена

02-28 21:37:32.484: BroadcastReceiver — основной запущен; Установить будильник

02-28 21:37:32.539: BroadcastReceiver — получена служба сигнализации

02-28 21:38:32.500: BroadcastReceiver — получена служба сигнализации

Обычно это должно происходить:

02-28 21:37:32.461: Основной - Широковещательная рассылка отправлена

02-28 21:37:32.484: BroadcastReceiver — основной запущен; Установить будильник

02-28 21:37:32.539: BroadcastReceiver — получена служба сигнализации

02-28 21:38:32.500: Служба обновления -- onHandleIntent()

Любые идеи? Вот мой код широковещательного приемника...

Широковещательный приемник:

public class AlarmReceiver extends BroadcastReceiver {

    private static final int INTERVAL = 60*1000; // check every 60 seconds

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction() != null) {
            if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
                Log.v(TAG, "BroadcastReceiver - Received Boot Completed; Set Alarm");
            
                setRecurringAlarm(context);
            }else if(intent.getAction().equalsIgnoreCase(Main.BROADCAST_STARTUP)){
                Log.v(TAG, "BroadcastReceiver - Main Started; Set Alarm");
            
                setRecurringAlarm(context);
            }else{
                Log.v(TAG, "BroadcastReceiver - Received " + intent.getAction());
            }
        }else{
            Log.v(TAG, "BroadcastReceiver - Received AlarmService");
        
            Intent i = new Intent(context, UpdateService02.class);
            context.startService(i);
        }
    }

    private void setRecurringAlarm(Context context) {
        Intent receiver = new Intent(context, AlarmReceiver.class);
        PendingIntent recurringDownload = PendingIntent.getBroadcast(context, 0, receiver, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarms.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), INTERVAL, recurringDownload);
    }
}

Служба намерений:

public class UpdateService02 extends IntentService {

    static DefaultHttpClient mClient = Client.getClient();
    private static final int LIST_UPDATE_NOTIFICATION = 100;

    public UpdateService02() {
        super("UpdateService02");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.v(TAG, "UpdateService -- onHandleIntent()");
    
        try {
            HttpGet httpget = new HttpGet(url);
            HttpResponse response;
            response = mClient.execute(httpget);
            BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));
        
            Intent i = new Intent(BROADCAST_UPDATE);  
            i.putExtra("text", in.readLine().toString() + " updated");
            sendBroadcast(i);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Я думал, что, возможно, мне нужно установить контекст запуска службы намерений как приложения, но я, честно говоря, понятия не имею.


person Rawr    schedule 29.02.2012    source источник
comment
Куда вы поместили журнал UpdateService -- onHandleIntent()? в службе onStartCommand()?   -  person user936414    schedule 29.02.2012
comment
Я подумал, что это может произойти, позвольте мне отредактировать его, чтобы показать мой IntentService.   -  person Rawr    schedule 29.02.2012
comment
когда IntentService не запускается, вы проверяли, запущена ли служба?   -  person user936414    schedule 29.02.2012
comment
Он всегда работает, я считаю. Но раньше это не было проблемой. Еще одна проблема, с которой я столкнулся, заключается в том, что IntentService с HTTPClient работает нормально, а затем, когда я переключаюсь на Wi-Fi, HTTPClient получает исключение UnknownHostException. Может ли это означать, что он пытается выполнить вызов HTTPClient, никогда не завершается, и поэтому я не могу запустить его снова?   -  person Rawr    schedule 29.02.2012
comment
Я также остановил службу в настройках Android, и она все равно не запускается снова.   -  person Rawr    schedule 29.02.2012


Ответы (2)


Я понял проблему...

Я изменил это:

try {
    HttpGet httpget = new HttpGet(url);
    HttpResponse response;
    response = mClient.execute(httpget);
    BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));

    Intent i = new Intent(BROADCAST_UPDATE);  
    i.putExtra("text", in.readLine().toString() + " updated");
    sendBroadcast(i);
} catch (ClientProtocolException e) {

к этому:

try {
    HttpGet httpget = new HttpGet(url);
    HttpResponse response;
    response = mClient.execute(httpget);
    BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));

    Intent i = new Intent(BROADCAST_UPDATE);  
    i.putExtra("text", in.readLine().toString() + " updated");
    sendBroadcast(i);
    in.close();
} catch (ClientProtocolException e) {

Иногда считыватель «засорялся», и в следующий раз, когда его вызывали, он все еще зависал, пытаясь обработать последний запрос. Добавление in.close(); позволило закрыть его после каждого использования. Отлично работает сейчас.

person Rawr    schedule 01.08.2012

Служба будет запущена только один раз. Если вы вызываете startService() для уже запущенной службы, никакого эффекта не будет. См. http://developer.android.com/guide/topics/fundamentals/services. HTML.

A service is "started" when an application component (such as an activity) starts it by
calling startService(). Once started, a service can run in the background indefinitely,
even if the component that started it is destroyed. 

Когда служба не запущена, намерение должно работать правильно.

Касательно

IntentService with the HTTPClient works fine and then when I switch over to Wifi the HTTPClient gets an UnknownHostException.

UnknownHostException возникает при отсутствии надлежащего сетевого подключения. Проверьте правильность подключения к сети.

person user936414    schedule 29.02.2012
comment
Две вещи... 1) IntentService - это частный случай службы. Он поставит запросы в очередь и остановится, когда все запросы будут обработаны. Если вы вызываете startService несколько раз, а служба уже запущена, ее метод onStart будет вызываться каждый раз, а onCreate будет вызываться только один раз, если его еще нет. Я почти уверен, что мой IntentService заканчивается после того, как он закончит свою работу, даже если onHandle будет вызываться, даже если он уже запущен, не так ли? - person Rawr; 29.02.2012
comment
2) Я исследовал UnknownHostException и его причины, однако интернет-соединение работает нормально. Все остальные приложения продолжают успешно получать доступ к Интернету. И у меня есть разрешение INTERNET в моем манифесте, что является единственной другой причиной этой проблемы. Я даже потратил время на изучение того, требуется ли разрешение на использование Wi-Fi-соединения для доступа в Интернет. - person Rawr; 29.02.2012
comment
HttpGet httpget = новый HttpGet(ht'tp://subdomain.domain.com/time.php); 'Добавлено, чтобы не превратилось в ссылку. - person Rawr; 29.02.2012