如何让两个闹钟启动两个服务?

How to have two alarms start two services?

我正在尝试让两个闹钟启动各自独立的服务。不过,它们似乎相互干扰,因为一次只有其中一个工作。我的代码中有什么我应该改变的吗?还是不可能这样做?

public void setAlarm(){
    AlarmManager alarmMgr1 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, DrawOverAppsService.class);
    Float alpha2 = alpha.getProgress()/100f;
    intent.putExtra("alpha", alpha2);

    PendingIntent alarmIntent1 = PendingIntent.getService(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    if(start.isChecked()) {
        alarmMgr1.cancel(alarmIntent1);
        java.util.Calendar calendar = java.util.Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(java.util.Calendar.HOUR_OF_DAY, 19);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        alarmMgr1.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent1);
        Log.d("a","b");
    }
    if(start.isChecked() == false) {
        alarmMgr1.cancel(alarmIntent1);
    }
}
public void stopAlarm(){
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent5 = new Intent(this, stopOverlay.class);
    PendingIntent alarmIntent = PendingIntent.getService(MainActivity.this, 2, intent5, 0);
    if(stop.isChecked()) {
        alarmMgr.cancel(alarmIntent);
        java.util.Calendar calendar = java.util.Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(java.util.Calendar.HOUR_OF_DAY, 5);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent);
    }
    if(stop.isChecked() == false) {
        alarmMgr.cancel(alarmIntent);
    }
}

此代码将安排两个警报以在不同时间启动两个单独的服务。

警报设置为从 MainActivity 的 onCreate 方法完成后的 60 秒和 120 秒。 (注意:由于 AlarmManager 的不精确调度,警报不一定会在 60 秒和 120 秒后 准确地 触发。有时需要惊人的耐心才能看到警报响起。)

通过查看应用的日志输出可以看到这两个服务的onStart命令正在执行。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setAlarm(Service1.class, 60);
        setAlarm(Service2.class, 120);

    }

    public void setAlarm(Class serviceClass, int delay){
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, serviceClass);
        PendingIntent alarmIntent = PendingIntent.getService(MainActivity.this,
                0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.cancel(alarmIntent);
        java.util.Calendar calendar = java.util.Calendar.getInstance();
        calendar.add(Calendar.SECOND, delay);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent);

        Log.d(TAG,"alarm set:" + serviceClass.getSimpleName());
    }
}

Service1.java

public class Service1 extends Service {

    private static final String TAG = "service1";

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "service started");
        return super.onStartCommand(intent, flags, startId);
    }

}

Service2.java

public class Service2 extends Service {

    private static final String TAG = "service2";

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "service started");
        return super.onStartCommand(intent, flags, startId);
    }

}