@AlexVWill

Почему происходит дублирование запуска сервиса?

Есть вот такой сервис
spoiler

public class UnlockMonitoringService extends Service {
    private BroadcastReceiver MonRes = new UnlockMonitoringReceiver();
    public UnlockMonitoringService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "Service created",
                Toast.LENGTH_SHORT).show();
        Log.i("TICK", "Service created");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service started",
                Toast.LENGTH_SHORT).show();
        Log.i("TICK", "Service started");
        registerReceiver(MonRes, new IntentFilter("android.intent.action.USER_PRESENT"));
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        try{
            if(MonRes !=null)
                unregisterReceiver(MonRes);
        }catch(Exception e){
            Log.e("Error", String.valueOf(e));
        }

        Toast.makeText(this, "Service terminated",
                Toast.LENGTH_SHORT).show();
        Log.i("TICK", "Service terminated");
    }

}


Который запускается через Broadcast receiver
spoiler
public class UnlockMonitoringReceiver extends BroadcastReceiver {
    public String checkresult = "Ok";
   @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){
            if (unlocktoserver(context) == 1){
                Toast toast = Toast.makeText(context,"Unlocked!", Toast.LENGTH_SHORT);
                toast.show();
                Log.i("TICK - Ok", intent.getAction());
            } else {
                Toast toast = Toast.makeText(context,"Error!", Toast.LENGTH_SHORT);
                toast.show();
                Log.i("TICK - Error", intent.getAction());
            }
        }
    }

    private int unlocktoserver(Context context) {
        //some code 
        Log.e("Return", String.valueOf(checkresult));
    }
}

Сервис висит в памяти постоянно, и реагирует через ресивер на разблокировку смартфона
registerReceiver(MonRes, new IntentFilter("android.intent.action.USER_PRESENT"));

Все работает нормально, за исключением того, что ресивер отрабатывает два раза. Т.е. при разблокировке функция unlocktoserver() вызывается дважды.
Вопрос: отчего это происходит? Заранее спасибо за ответ.
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
@5465
Вероятнее всего проблема заключается в том, что BroadcastReceiver UnlockMonitoringReceiver зарегистрирован несколько раз, что приводит к вызову метода unlocktoserver() несколько раз.

Попробуйте проверить, не зарегистрирован ли BroadcastReceiver UnlockMonitoringReceiver в вашем коде более одного раза. Если он зарегистрирован несколько раз, то вам нужно удалить все лишние регистрации BroadcastReceiver'ов.

Также возможно, что ваша система запускает несколько копий сервиса UnlockMonitoringService, поэтому вам может потребоваться проверить это, например, добавив логирование в метод onStartCommand() для отслеживания количества вызовов.

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

public class MyService extends Service {
    private int counter = 0;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("MyService", "onStartCommand() called. counter = " + counter);

        // Увеличиваем значение счетчика
        counter++;

        // Возвращаем значение START_STICKY
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("MyService", "onDestroy() called.");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}


Этот сервис просто увеличивает значение счетчика каждый раз, когда вызывается метод onStartCommand(). Вы можете использовать этот код в своем проекте, чтобы отследить количество вызовов метода onStartCommand() и убедиться, что сервис не запускается несколько раз.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы