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