Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该如何将BroadcastReceiver类代码放入服务类中,以便在服务类中注册和注销它?_Java_Android_Android Service_Alarmmanager - Fatal编程技术网

Java 我应该如何将BroadcastReceiver类代码放入服务类中,以便在服务类中注册和注销它?

Java 我应该如何将BroadcastReceiver类代码放入服务类中,以便在服务类中注册和注销它?,java,android,android-service,alarmmanager,Java,Android,Android Service,Alarmmanager,我正在制作一个倒计时Android应用程序,在该程序中,我启动了一个名为的服务以保持计时器运行,即使应用程序被发送到后台。我想设置计时器启动时服务内计时器持续时间的警报。当警报被触发时,我想用通知通知用户。我正在使用处理程序运行计时器。 目前,我已尝试在服务中设置警报,我正在将CouncDownDuration传递给setAlarm(long)。当触发警报时,receiver类将显示toast。但是问题是,警报在随机时间触发(主要在3-5秒内) 这是我的密码: TimerService.java

我正在制作一个倒计时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);

希望这对你有帮助

谢谢你的意见。我已经解决了问题,并且发布了更新。现在正在寻求解决剩下的问题。