Я создаю приложение, единственным компонентом которого является service
, который продолжает работать в фоновом режиме (в основном прокси-сервер), но я не могу найти способ запуска этой службы. Приложение не может иметь никакого пользовательского интерфейса или взаимодействия с пользователем, поэтому я не использую Activity. Broadcast receiver
может слушать широковещательную рассылку BOOT, но как мне начать работу с первого раза, когда она установлена, и как я могу ее запустить?
или есть трансляция, которую я могу слушать после того, как приложение установлено, например. может быть TIME_TICK, но это должно быть зарегистрировано из активности, я думаю.
Как начать приложение только для Android-приложений
Ответ 1
К сожалению, сейчас нет надежного способа получения трансляционного события после установки вашего приложения, ACTION_PACKAGE_ADDED. Intent не транслирует к вновь установленному пакету.
Для получения события 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));
}
}
}
};
Удачи.
Ответ 2
Возврат START_STICKY
в Service.onStartCommand
Android перезапустит вашу службу
Ответ 3
Я исследую ту же проблему. Вот что я нашел: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html
Эта простая небольшая демонстрация демонстрирует решение, играя немного пинг-понга между BroadcatReceiver и службой. Получатель зарегистрирован для начала во время загрузки, зарегистрировавшись в манифесте, чтобы получить ACTION_BOOT_COMPLETED. Он просто запускает службу при получении ACTION_BOOT_COMPLETED. Служба, в свою очередь, регистрирует BroadcastReceiver, а затем для ACTION_TIME_TICK.
Логика приложения будет реализована в BroadcastReceiver.