首页 > 解决方案 > 如何在 Android 中触发 BroadcastReceiver 之前启动服务?

问题描述

我有一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类

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");

}

应用服务类

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);
        }
    }

我的日志猫

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

标签: javaandroidservicebroadcastreceiver

解决方案


没有办法做到这一点。这是正在发生的事情:

  • 警报响起

  • 未运行的应用程序已启动。记录接收到的广播,并在主线程上的 Handler 中调用接收者的动作。

  • 该应用程序创建应用程序类。这会调用 startService,它会在主线程上的 Handler 中添加一个创建服务的操作。

  • 返回到主线程消息循环。它获取队列中的下一条消息,即 BR 消息,并运行它,启动 BroadcastReceiver。

  • 返回到主线程消息循环。它获取队列中的下一条消息,即 SS 消息,并运行它,启动服务。

没有办法改变任何这一切的顺序。


推荐阅读