Android: остановка сервиса в другой активности - PullRequest
5 голосов
/ 12 марта 2012

Как я могу остановить свою Службу в другой Деятельности?

Я запускаю службу в моей сводной информации Активность

SocketServiceIntent = new Intent(this, SocketService.class);
SocketServiceIntent.putExtra("MessageParcelable", mp);
startService(SocketServiceIntent);

И запускаю свою статусную Активность из моей сводной информации Активность

Intent intent = new Intent(SummaryActivity.this,
                StatusActivity.class);
intent.putExtra("MessageParcelable", mp);
startActivity(intent);

Моя проблема в том, что я не знаю, как передать статусу активности SocketServiceIntent.

Ответы [ 5 ]

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

Вам следует позвонить Activity(ContextWrapper)#stopService:

stopService(new Intent(SummaryActivity.this, SocketService.class));
4 голосов
/ 12 марта 2012

Вы не объяснили, как вы в настоящее время пытаетесь использовать stopService () и какую ошибку вы получаете. Расширьте свой вопрос, и вы можете получить более полезные ответы.

Вам нужно позвонить по этой активности:

stopService(new Intent(SummaryActivity.this, SocketService.class));

Замените "SummaryActivity" на имя класса Activity, из которого вы останавливаете службу.

Убедитесь, что у вас есть несвязанный сервис из всех операций привязки, прежде чем пытаться остановить его. Как объясняют Документы Android , вы не можете остановить Службу, которая в данный момент связана с действием.

В качестве совета по проектированию: часто лучше вызывать stopSelf() изнутри работающей службы, а не напрямую stopService(). Вы можете добавить метод shutdown() в свой интерфейс AIDL, который позволяет Activity запрашивать вызов stopSelf(). Это инкапсулирует логику остановки и дает вам возможность контролировать состояние вашей Службы, когда она остановлена, аналогично тому, как вы обрабатываете Thread.

Например:

public MyService extends IntentService {

    private boolean shutdown = false;

    public void doSomeLengthyTask() {
        // This can finish, and the Service will not shutdown before 
        // getResult() is called...
        ...
    }

    public Result getResult() {
        Result result = processResult();

        // We only stop the service when we're ready
        if (shutdown) {
            stopSelf();
        }

        return result;
    }

    // This method is exposed via the AIDL interface
    public void shutdown() {
        shutdown = true;
    }

}

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

2 голосов
/ 19 ноября 2017

Запустить услугу:

// Java
Intent SocketServiceIntent = new Intent(this, SocketService.class);
SocketServiceIntent.putExtra("MessageParcelable", mp);
startService(SocketServiceIntent);

//Kotlin
startService(Intent(this, SocketService::class.java))

Остановить услугу в любой деятельности:

//Java
stopService(new Intent(this, SocketService.class))

//Kotlin
stopService(Intent(this, SocketService::class.java))
0 голосов
/ 29 сентября 2018

Просто вызовите метод stopService()

Intent intent = new Intent(this,SocketService.class);
stopService(intent);
0 голосов
/ 12 марта 2012

просто вызовите stopService в summaryActivity

...