Java 我应该如何将BroadcastReceiver类代码放入服务类中,以便在服务类中注册和注销它?
我正在制作一个倒计时Android应用程序,在该程序中,我启动了一个名为的服务以保持计时器运行,即使应用程序被发送到后台。我想设置计时器启动时服务内计时器持续时间的警报。当警报被触发时,我想用通知通知用户。我正在使用处理程序运行计时器。 目前,我已尝试在服务中设置警报,我正在将CouncDownDuration传递给setAlarm(long)。当触发警报时,receiver类将显示toast。但是问题是,警报在随机时间触发(主要在3-5秒内) 这是我的密码: TimerService.javaJava 我应该如何将BroadcastReceiver类代码放入服务类中,以便在服务类中注册和注销它?,java,android,android-service,alarmmanager,Java,Android,Android Service,Alarmmanager,我正在制作一个倒计时Android应用程序,在该程序中,我启动了一个名为的服务以保持计时器运行,即使应用程序被发送到后台。我想设置计时器启动时服务内计时器持续时间的警报。当警报被触发时,我想用通知通知用户。我正在使用处理程序运行计时器。 目前,我已尝试在服务中设置警报,我正在将CouncDownDuration传递给setAlarm(long)。当触发警报时,receiver类将显示toast。但是问题是,警报在随机时间触发(主要在3-5秒内) 这是我的密码: TimerService.java
private long countDownDuration = 25000;//25 sec timer
public void startTimer(){
mIsTimerRunning = true;
startTime = SystemClock.elapsedRealtime();
setAlarm(countdownTimer);
Log.i(TAG,"Timer Started");
}
private void setAlarm(long countDownDuration){
mAlarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, TimerExpiredReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mAlarmManager.setExact(ELAPSED_REALTIME_WAKEUP, countDownDuration, sender);
} else {
mAlarmManager.set(ELAPSED_REALTIME_WAKEUP, countDownDuration, sender);
}
Log.i(TAG,"Alarm Set of " + countDownDuration/1000 );
}
private void cancelAlarm(){
Intent intent = new Intent(this, TimerExpiredReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
mAlarmManager.cancel(sender);
Log.i(TAG,"Alarm Cancelled");
}
TimerExpiredReceiver.java
public class TimerExpiredReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// context.mIsTImerRunning = false;
Toast.makeText(context,"Time's Up!!",Toast.LENGTH_LONG).show();
}}
更新1:
找出了随机触发的原因。对TimerService的startTimer()和setAlarm(long)进行了更改。
以下是更新的TimerDrive代码:
public class TimerService extends Service {
protected static final String TAG = "TimerService";
private long startTime, endTime;
private boolean mIsTimerRunning;
private final IBinder mBinder = new TimerBinder();
private static int count = 0;
private long countDownDuration = 25000;//25 sec timer
private long wakeUpTime;
private AlarmManager mAlarmManager;
private BroadcastReceiver mAlarmReceiver;
public TimerService() {
count++;
Log.i(TAG,"TimerService Object No. " + count);
}
@Override
public void onCreate() {
Log.i(TAG, "Service Created");
startTime = 0;
endTime = 0;
mIsTimerRunning = false;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"Service Started");
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"Service Bound");
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG,"Service Destroyed");
}
public void startTimer(){
mIsTimerRunning = true;
startTime = SystemClock.elapsedRealtime();
wakeUpTime = startTime + countDownDuration;
setAlarm(wakeUpTime);
Log.i(TAG,"Timer Started");
}
public void stopTimer(){
mIsTimerRunning = false;
endTime = SystemClock.elapsedRealtime() - startTime;
cancelAlarm();
Log.i(TAG,"Timer Stopped : endtime = " + endTime);
}
public int getElapsedTime(){
return (int)TimeUnit.MILLISECONDS.toSeconds(SystemClock.elapsedRealtime() - startTime);
}
public boolean isTimerRunning() {
return mIsTimerRunning;
}
private void setAlarm(long wakeUpTime){
mAlarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, TimerExpiredReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mAlarmManager.setExact(ELAPSED_REALTIME_WAKEUP, wakeUpTime, sender);
} else {
mAlarmManager.set(ELAPSED_REALTIME_WAKEUP, wakeUpTime, sender);
}
Log.i(TAG,"Alarm Set of " + wakeUpTime/1000 );
}
private void cancelAlarm(){
Intent intent = new Intent(this, TimerExpiredReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
mAlarmManager.cancel(sender);
Log.i(TAG,"Alarm Cancelled");
}
public class TimerBinder extends Binder {
TimerService getService() {
return TimerService.this;
}
}}
问题:
现在正在寻找一种方法,将TimerExpiredReceiver代码放在Timerservice中,这样就可以在服务中注册和取消注册。以及接收者可以访问TimerService类的成员,并且可以显示通知,而不是土司。
任何帮助都将不胜感激。
谢谢大家! 在计数器过期后立即启动报警服务,并将时间设置为0,以便它开始鸣响
Intent intent = new Intent(DashboardScreen.this, ServiceClass.class);
PendingIntent pintent = PendingIntent.getService(DashboardScreen.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 0*1000, pintent);
希望这对你有帮助 谢谢你的意见。我已经解决了问题,并且发布了更新。现在正在寻求解决剩下的问题。