Как запустить сервисное приложение для Android - PullRequest
46 голосов
/ 13 июня 2009

Я создаю приложение, единственным компонентом которого является service, который продолжает работать в фоновом режиме (в основном прокси-сервер), но я не могу найти способ, как запустить эту службу. Приложение не может иметь пользовательского интерфейса или взаимодействия с пользователем, поэтому я не использую Activity.
Broadcast receiver может слушать трансляцию BOOT, но как мне запустить службу в первый раз, когда она установлена, и как я могу сохранить ее работоспособной? или есть ли трансляция, которую я могу слушать после установки приложения, например может быть TIME_TICK, но это должно быть зарегистрировано по активности, я думаю.

Ответы [ 3 ]

43 голосов
/ 13 июня 2009

К сожалению, сейчас нет надежного способа получения события широковещания после установки вашего приложения, ACTION_PACKAGE_ADDED Намерение не транслируется во вновь установленный пакет.

Для получения события ACTION_BOOT_COMPLETED вам необходимо будет иметь класс приемника вещания и вашу услугу. Я также рекомендовал бы добавить ACTION_USER_PRESENT , предназначенный для перехвата этим широковещательным приемником, для этого требуется Android 1.5 (minSDK = 3), это будет вызывать Ваш широковещательный приемник, когда пользователь разблокирует свой телефон. Последнее, что вы можете сделать, чтобы сохранить работоспособность вашего сервиса без его автоматического отключения, - это вызвать Service.setForeground () в вашем сервисе onCreate, чтобы сообщить Android, что ваш сервис не должен быть остановлено, это было добавлено в основном для служб типа mp3-плеера, которые должны продолжать работать, но могут использоваться любым сервисом.

Убедитесь, что в манифесте вы добавили правильные разрешения для событий boot_complete и user_present.

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

package com.snctln.util.WeatherStatus;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class WeatherStatusServiceReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if(intent.getAction() != null)
        {
            if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
                intent.getAction().equals(Intent.ACTION_USER_PRESENT))
            {
                context.startService(new Intent(context, WeatherStatusService.class));
            }
        }
    }
};

Удачи.

14 голосов
/ 23 июля 2010

Возврат START_STICKY в Service.onStartCommand

Android перезапустит ваш сервис

0 голосов
/ 30 мая 2013

Я исследую ту же проблему. Вот что я нашел: http://kfb -android.blogspot.de / 2009/04 / регистрации в обмен на timetick-после-reboot.html

Эта простая небольшая демонстрация демонстрирует решение проблемы, играя в пинг-понг между BroadcatReceiver и Service. Приемник зарегистрирован для запуска во время загрузки, зарегистрировавшись в Манифесте для получения ACTION_BOOT_COMPLETED. Он просто запускает службу при получении ACTION_BOOT_COMPLETED. Service в свою очередь регистрирует BroadcastReceiver затем для ACTION_TIME_TICK.

Логика приложения будет реализована в BroadcastReceiver.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...