java - 如何在 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
解决方案
没有办法做到这一点。这是正在发生的事情:
警报响起
未运行的应用程序已启动。记录接收到的广播,并在主线程上的 Handler 中调用接收者的动作。
该应用程序创建应用程序类。这会调用 startService,它会在主线程上的 Handler 中添加一个创建服务的操作。
返回到主线程消息循环。它获取队列中的下一条消息,即 BR 消息,并运行它,启动 BroadcastReceiver。
返回到主线程消息循环。它获取队列中的下一条消息,即 SS 消息,并运行它,启动服务。
没有办法改变任何这一切的顺序。
推荐阅读
- cassandra - 如何使用 SSL 选项和多节点选项从 exasol db 连接 cassandra db
- javascript - 带有变量和查找的 Jquery 选择器
- reactjs - 通过反应链接传递参数时,这里有点问题,我有“TypeError:无法读取未定义的属性'位置'”
- flutter - 由于上下文问题,无法从子类访问 bloc?
- javascript - 关于自定义 Blob 对象 URL
- javascript - 这是使用事件源的正确方法吗?
- html - 检查文本字段中是否输入了任何 html 标签或 javascript 代码
- r - 比较纵向数据集中连续行中的值
- ios - 如何为键盘扩展创建单元测试
- r - 使用 purrr::map() 更改和分配新变量名