StartForeground для IntentService - PullRequest
       17

StartForeground для IntentService

12 голосов
/ 29 марта 2012

У меня есть IntentService, и я хочу сделать его липким с текущим уведомлением.Проблема в том, что уведомление появляется, а затем сразу исчезает.Служба продолжает работать.Как я должен использовать startForeground() в IntentService?

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    Notification notification = new Notification(R.drawable.marker, "Notification service is running",
            System.currentTimeMillis());
    Intent notificationIntent = new Intent(this, DashboardActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
        Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    notification.setLatestEventInfo(this, "App",
            "Notification service is running", pendingIntent);
    notification.flags|=Notification.FLAG_NO_CLEAR;
    startForeground(1337, notification);
    return START_STICKY;
}

@Override
protected void onHandleIntent(Intent intent) {

    String id = intent.getStringExtra(ID);
    WebSocketConnectConfig config = new WebSocketConnectConfig();
    try {
        config.setUrl(new URI("ws://" + App.NET_ADDRESS
                + "/App/socket?id="+id));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    ws = SimpleSocketFactory.create(config, this);
    ws.open();
}

Спасибо

Ответы [ 2 ]

18 голосов
/ 29 марта 2012

Это не должно быть IntentService. Как написано, ваш IntentService будет жить в течение миллисекунды или около того. Как только onHandleIntent() возвращается, сервис уничтожается. Это должен быть обычный Service, где вы создаете свой собственный поток и управляете временем жизни потока и сервиса.

Причина, по которой ваш Notification немедленно исчезает, заключается в том, что служба немедленно отключается.

4 голосов
/ 02 декабря 2016

В документации для IntentService говорится:

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

Итак, я полагаю, проблема в том, что ваша служба не работает после завершения onHandleIntent().Следовательно, сервис останавливается и уведомление прекращается.Итак, концепция IntentService, вероятно, не лучший вариант для вашей задачи.


Поскольку вопрос называется «StartForeground for IntentService», я хотел бы уточнить некоторые моменты:

Это действительнопросто заставить IntentService работать на переднем плане (см. код ниже), но вам необходимо учесть несколько вещей:

  • Не запускать службу на переднем плане, если это занимает несколько секундтолько - это может вызвать ошибку у ваших пользователей.Представьте, что вы периодически запускаете короткие задачи - это приведет к появлению и исчезновению уведомлений - ухххх *

  • Возможно, вам понадобится сделать ваш сервис способным поддерживать бодрствование устройства (но это другая историяочень хорошо описан в работе над переполнением стека) *

  • Если вы поставили в очередь несколько Intents для своей службы IntentService, то приведенный ниже код будет отображать / скрывать уведомление.(Таким образом, для вашего случая может быть лучшее решение - так как @CommonsWare предлагает расширить Service и делать все самостоятельно, однако хотелось бы отметить - в Javadoc нет ничего, что IntentService говорит, что он работает всего несколько секунд - он работает до тех пор, покаэто должно что-то делать.)


public class ForegroundService extends IntentService {

    private static final String TAG = "FrgrndSrv";

    public ForegroundService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        Notification.Builder builder = new Notification.Builder(getBaseContext())
                .setSmallIcon(R.drawable.ic_foreground_service)
                .setTicker("Your Ticker") // use something from something from R.string
                .setContentTitle("Your content title") // use something from something from
                .setContentText("Your content text") // use something from something from
                .setProgress(0, 0, true); // display indeterminate progress

        startForeground(1, builder.build());
        try {
            doIntesiveWork();
        } finally {
            stopForeground(true);
        }
    }

    protected void doIntesiveWork() {
        // Below should be your logic that takes lots of time
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...