Как запустить Сервис до запуска BroadcastReceiver в Android? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть класс BroadcastReceiver, который иногда срабатывает И у меня также есть класс Service.Мой Service класс начинается с моего Application класса с именем G.class.Я хочу, чтобы мой Service класс начинался до BroadcastReceiver класса.но, как я вижу в LogCat, сначала G.class начинается и заканчивается, затем начинается класс BroadcastReceiver и заканчивается, затем начинается класс Service.В чем проблема?

AlarmReceiver.class

import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Intent;
import com.hadi.android.dm.app.Logger;

public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Logger.i("receiver started");
    //do something
}

}

G.class

import android.content.Intent;

public class G extends Application {

  @Override
  public void onCreate() {
    super.onCreate();

    Logger.i("G started");
    startService(new Intent(getApplicationContext(), ApplicationService.class));
    Logger.i("G ended");

}

ApplicationService.class

import android.app.Service;
import android.content.Context;
import android.content.Intent;

public class ApplicationService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Logger.i("service started");
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Logger.i("service ended");
    }
}

Как сработает мой BroadcastReciever

public void schedule(long time) {
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 2, new Intent(context, AlarmReceiver.class), 0);
        android.app.AlarmManager alarmManager = (android.app.AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent);
        } else {
            alarmManager.set(android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent);
        }
    }

My LogCat

07-09 00:44:00.797 18172-18172/com.hadi.android.dm I/MYAPP: G started
07-09 00:44:00.886 18172-18172/com.hadi.android.dm I/MYAPP: G ended
07-09 00:44:00.888 18172-18172/com.hadi.android.dm I/MYAPP: receiver started
07-09 00:44:00.890 18172-18172/com.hadi.android.dm I/MYAPP: service started

1 Ответ

1 голос
/ 08 июля 2019

Нет способа сделать это. Вот что происходит:

  • Сработает будильник

  • Приложение, которое не запущено, запущено. Полученная трансляция отмечается, и приемник для вызова получателя помещается в обработчик в главном потоке.

  • Приложение создает класс Application. Это вызывает startService, который добавляет действие для создания службы в обработчик в главном потоке.

  • Цикл сообщений основного потока возвращается к. Он принимает следующее сообщение в очереди, сообщение BR, и запускает его, запуская BroadcastReceiver.

  • Возвращается цикл сообщений основного потока. Он принимает следующее сообщение в очереди, сообщение SS, и запускает его, запуская Службу.

Нет способа изменить порядок в этом.

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