代码之家  ›  专栏  ›  技术社区  ›  Hadi

在Android中,如何在BroadcastReceiver触发之前启动服务?

  •  0
  • Hadi  · 技术社区  · 5 年前

    我有一个 BroadcastReceiver 有时会被触发的类,我也有一个 Service 班我的 课程从我的课堂开始 Application G.class . 我想要我的 服务 广播接收机 班但正如我在书中看到的 LogCat G级 开始,然后结束 广播接收机 上课开始,然后结束 上课开始了。有什么问题?

    警报接收器。班

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

    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
    
    2 回复  |  直到 5 年前
        1
  •  1
  •   Gabe Sechan    5 年前

    这是不可能的。下面是正在发生的事情:

    • 闹钟响了

    • 应用程序创建应用程序类。这将调用startService,它将向主线程上的处理程序添加创建服务的操作。

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

    在任何情况下都无法更改订单。