【问题标题】:Android : setAlarmManager(...) open an activity instead of delaying the openingAndroid : setAlarmManager(...) 打开一个活动而不是延迟打开
【发布时间】:2014-11-26 08:01:00
【问题描述】:

在android中,我必须在一个特殊的时间设置一个闹钟,它会在一天中的正确时间响起并打开一个活动。

我的问题是函数“alarmManager.set(...)”立即打开目标活动,当时间到时,再次打开相同的活动。

我不明白为什么会发生这种情况,我该如何纠正它?

当前状态:我有一个时间选择器,可以帮助我选择时间。我还有一个按钮,当我通过从时间选择器中检索时间并以毫秒为单位计算下一个警报时单击它时调用函数 alarmManager.set()。

谢谢

按钮代码:

public void setTheAlarm(View view) {

    TimePicker tp_clock = (TimePicker) findViewById(R.id.tp_timeToRing);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    int alarmHours = tp_clock.getCurrentHour();
    int alarmMinutes = tp_clock.getCurrentMinute();

    Toast.makeText(this, "Alarm set for " + alarmHours + "h" + alarmMinutes, Toast.LENGTH_LONG).show();

    Long time = calculateTime(alarmHours, alarmMinutes);
    alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}

calculateTime函数代码:

public Long calculateTime(int alarmHours, int alarmMinutes) {

    Calendar c = Calendar.getInstance();
    int currentHours = c.get(Calendar.HOUR);
    if (c.get(Calendar.AM_PM) == 1)
        currentHours +=12;
    int currentMinutes = c.get(Calendar.MINUTE);
    int setAlarmHours = 0;
    int setAlarmMinutes = 0;
    int balanceWithMinute = 0;

    if (alarmMinutes >= currentMinutes) {

        setAlarmMinutes = alarmMinutes - currentMinutes;
    }
    else {

        setAlarmMinutes = (60 - currentMinutes) + alarmMinutes;
        balanceWithMinute = 1;
    }
    if (alarmHours > currentHours)
        setAlarmHours = alarmHours - currentHours;

    if (alarmHours < currentHours)
        setAlarmHours = (24 - currentHours) +alarmHours - balanceWithMinute;

    if (alarmHours == currentHours && balanceWithMinute == 1)
        setAlarmHours = 23;

    Long time = new GregorianCalendar().getTimeInMillis()+setAlarmHours*setAlarmMinutes*60*1000;
    return time;
}

alarmManager 的代码:

package fr.pixelcraft.victor.wackertest.SoundPackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import fr.pixelcraft.victor.wackertest.LoginActivity;

public class AlarmReciever extends BroadcastReceiver {

    private String userToken;
    private String userId;

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent i=new Intent(context, PlanASoundActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        userToken = intent.getStringExtra(LoginActivity.USER_TOKEN);
        userId = intent.getStringExtra(LoginActivity.USER_ID);

        i.putExtra(LoginActivity.USER_TOKEN, userToken);
        i.putExtra(LoginActivity.USER_ID, userId);
        context.startActivity(i);

        Toast.makeText(context, "Alarm triggered", Toast.LENGTH_LONG).show();
    }
}

【问题讨论】:

  • 可能您设置的时间已经过去。这使得 AlarmManager 立即触发
  • 你是对的!我必须修改我的函数calculateTime。谢谢 !发布一个解决方案,我会验证它。

标签: android android-activity alarmmanager synchronize


【解决方案1】:

https://stackoverflow.com/users/2649012/frank-n-stein:

您可能设置了一个已经过去的时间。这使得 AlarmManager 立即触发。 -

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多