Android: создать сервис, который запускается при остановке приложения - PullRequest
4 голосов
/ 16 марта 2012

Как создать Службу, которая продолжает работать, когда ваше приложение остановлено?Я создаю службу в отдельном процессе в файле манифеста:

<service
    android:name="com.example.myservice"
    android:process=":remoteservice" />

Я также возвращаю START_STICKY в onStartCommand службы:

@Override
public in onStartCommand(Intent intent, int flags, int startId){
    return Service.START_STICKY;
}

1 Ответ

4 голосов
/ 16 марта 2012

Я бы не стал использовать атрибут android: process - он фактически запускает ваш сервис в отдельном процессе и затрудняет такие вещи, как общие настройки.Вам не придется беспокоиться о том, что ваш сервис умирает, когда ваше приложение умирает, сервис будет продолжать работать (это точка сервиса).Вы также не хотите привязывать сервис, потому что он запустится и умрет, когда будут привязки.При этом:

<service
    android:enabled="true"
    android:exported="true"
    android:name=".MyService"
    android:label="@string/my_service_label"
    android:description="@string/my_service_description"
    <intent-filter>
        <action android:name="com.package.name.START_SERVICE" />
    </intent-filter>
</service>

Вы можете определить свое собственное действие для намерения запустить службу (не может быть запущено системой - должно быть действием).Мне нравится устанавливать для «enabled» значение true, чтобы система могла создавать экземпляры моего сервиса, и «экспортировать», чтобы другие приложения могли отправлять намерения и взаимодействовать с моим сервисом.Вы можете найти больше об этом здесь .

Вы также можете создать долгосрочную службу, которая использует привязки, если вы сделаете это, просто добавьте и назначьте привязку, такую ​​как:

<action android:name="com.package.name.IRemoteConnection" />

Теперь, чтобы запустить службу из вашей деятельности:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent serviceIntent = new Intent("com.package.name.START_SERVICE");
        this.startService(serviceIntent);

        // You can finish your activity here or keep going...
    }
}

Теперь для службы:

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // This is triggered by the binder action intent.
        // You can return your binder here if you want...
        return null;
    }


    @Override
    public void onCreate() {
        // Called when your service is first created.
    }

    @Override
    public in onStartCommand(Intent intent, int flags, int startId) {
        // This is triggered by the service action start intent
        return super.onStartCommand(intent, flags, startId);
    }
}

Теперь ваша служба должна работать.Чтобы помочь с долголетием, есть некоторые хитрости.Запустите его в качестве службы переднего плана (вы делаете это в службе) - это заставит вас создать значок уведомления, который будет вставлен в строку состояния.Также сохраняйте индикатор HEAP, чтобы снизить вероятность того, что ваше приложение будет убито Android.

Кроме того, служба убивается, когда вы убиваете DVM - например, если вы идете в «Настройки» -> «Приложения» и останавливаете приложение, которое выубивая DVM и, таким образом, убивая сервис.Если вы видите, что ваше приложение работает в настройках, это еще не значит, что действие выполняется.Деятельность и обслуживание имеют разные жизненные циклы, но могут совместно использовать DVM.Просто помните, что вам не нужно убивать свою активность, если она не нужна, просто позвольте Android справиться с этим.

Надеюсь, это поможет.

...