如何在 Android 中触发 BroadcastReceiver 之前启动服务?
How to start Service before BroadcastReceiver gets trigged in Android?
我有一个 BroadcastReceiver
class 有时会被触发我还有一个 Service
class。我的 Service
class 是从我的 Application
class 开始的 G.class
。我希望我的 Service
class 在 BroadcastReceiver
class 之前开始。但正如我在 LogCat
中看到的那样,首先 G.class
开始并结束,然后 BroadcastReceiver
class 开始并结束然后 Service
class 开始。有什么问题?
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);
}
}
我的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
没有办法做到这一点。这是正在发生的事情:
闹钟响
非运行的应用已启动。收到的广播会被记录下来,并在主线程的处理程序中调用接收器。
该应用程序创建了应用程序 class。这会调用 startService,它会在主线程上向 Handler 添加创建服务的操作。
返回主线程消息循环。它获取队列中的下一条消息,即 BR 消息,并运行它,启动 BroadcastReceiver。
返回主线程消息循环。它获取队列中的下一条消息,即 SS 消息,并运行它,启动服务。
无法更改其中任何一项的顺序。
我有一个 BroadcastReceiver
class 有时会被触发我还有一个 Service
class。我的 Service
class 是从我的 Application
class 开始的 G.class
。我希望我的 Service
class 在 BroadcastReceiver
class 之前开始。但正如我在 LogCat
中看到的那样,首先 G.class
开始并结束,然后 BroadcastReceiver
class 开始并结束然后 Service
class 开始。有什么问题?
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);
}
}
我的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
没有办法做到这一点。这是正在发生的事情:
闹钟响
非运行的应用已启动。收到的广播会被记录下来,并在主线程的处理程序中调用接收器。
该应用程序创建了应用程序 class。这会调用 startService,它会在主线程上向 Handler 添加创建服务的操作。
返回主线程消息循环。它获取队列中的下一条消息,即 BR 消息,并运行它,启动 BroadcastReceiver。
返回主线程消息循环。它获取队列中的下一条消息,即 SS 消息,并运行它,启动服务。
无法更改其中任何一项的顺序。