Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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
Android AlarmManager:如何避免关闭过去的警报_Android_Android Intent_Android Activity_Alarmmanager - Fatal编程技术网

Android AlarmManager:如何避免关闭过去的警报

Android AlarmManager:如何避免关闭过去的警报,android,android-intent,android-activity,alarmmanager,Android,Android Intent,Android Activity,Alarmmanager,你好,谢谢你的帮助 我有一个应用程序,它使用AlarmManager在接下来的几周、几个月内每天设置一个警报 我为一周中的每一天设置一个闹钟来启动活动 及 一周中的每一天都有一个警报,用于在活动结束后停止活动 有时 我有以下问题,我将尝试用以下几行解释: 今天是星期三 我打开应用程序,设置周一、周二、周三、周四、周五、周六、周日的闹钟。。。 一旦我设置了警报: 星期一和星期二的所有警报都会立即关闭,我最后有4个活动实例 请问我如何避免这个 请看我的一段代码: // SET

你好,谢谢你的帮助

我有一个应用程序,它使用AlarmManager在接下来的几周、几个月内每天设置一个警报

  • 我为一周中的每一天设置一个闹钟来启动活动

  • 一周中的每一天都有一个警报,用于在活动结束后停止活动 有时
我有以下问题,我将尝试用以下几行解释:

今天是星期三

我打开应用程序,设置周一、周二、周三、周四、周五、周六、周日的闹钟。。。 一旦我设置了警报:

星期一和星期二的所有警报都会立即关闭,我最后有4个活动实例

请问我如何避免这个

请看我的一段代码:

        // SET THE ALARM FOR STARTING THE ACTIVITY 
        Intent smon = new Intent(ctxt, VideoActivty.class);
        smon.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent psmon = PendingIntent.getActivity(ctxt, 0, smon, 0);

        Calendar calSet = Calendar.getInstance();
        calSet.set(Calendar.DAY_OF_WEEK, 2);
        calSet.set(Calendar.HOUR_OF_DAY, hsmon);
        calSet.set(Calendar.MINUTE, msmon);
        calSet.set(Calendar.SECOND, 0);
        calSet.set(Calendar.MILLISECOND, 0);

        mgr.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(),
                7 * 24 * 60 * 60 * 1000, psmon);

        // SET THE ALARM FOR KILLING THE ACTIVITY 
        Intent fmon = new Intent(ctxt, VideoActivty.class);
        fmon.putExtra("finish", true);
        PendingIntent pfmon = PendingIntent.getActivity(ctxt, 0, fmon, 0);

        calSet.set(Calendar.DAY_OF_WEEK, 2);
        calSet.set(Calendar.HOUR_OF_DAY, hfmon);
        calSet.set(Calendar.MINUTE, mfmon);
        calSet.set(Calendar.SECOND, 0);
        calSet.set(Calendar.MILLISECOND, 0);

        mgr.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(),
                7 * 24 * 60 * 60 * 1000, pfmon);
这是一项活动:

public class VideoActivty extends Activity {
private VideoView video;
private MediaController ctlr;
private PowerManager.WakeLock wl;
private KeyguardLock keyguard;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //
    PowerManager pm = (PowerManager) this
            .getSystemService(this.POWER_SERVICE);
    wl = pm.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();

    KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    keyguard = km.newKeyguardLock("MyApp");
    keyguard.disableKeyguard();

    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    VideoView videoHolder = new VideoView(this);
    //if you want the controls to appear
    videoHolder.setMediaController(new MediaController(this));
    Uri video = Uri.parse("android.resource://" + getPackageName() + "/" 
    + R.raw.ingress); //do not add any extension
    //if your file is named sherif.mp4 and placed in /raw
    //use R.raw.sherif
    videoHolder.setVideoURI(video);
    setContentView(videoHolder);

    videoHolder.start();
    videoHolder.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {

                        mp.start();
        }
    });
}


@Override
protected void onNewIntent (Intent i){


  if( i.getBooleanExtra("finish",false) ){
      wl.release();
      keyguard.reenableKeyguard();
      finish();
  }
}


}
来自AlarmManager

int RTC_System.currentTimeMillis()中的唤醒报警时间(以UTC为单位的挂钟时间),该时间将在设备关闭时唤醒设备`

从日历

Calendar.getInstance()

日历子类实例设置为默认时区中的当前日期和时间

这两者将使用不同的时区

另外,仅更改日历对象的
DAY\u OF\u WEEK
字段并不会更改日历对象的
WEEK\u OF\u YEAR
字段。这意味着,如果它是Wed,但您正在为Mon设置闹钟(只更改一周中的某一天),它将立即关闭,因为它是为本周的Mon设置的。如果您需要在一周中的每一天的同一时间设置闹钟

    alarmManager(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (24hoursOfMilliseconds), 24hoursOfMilliseconds, pendingIntent);
这将设置相同的警报,每24小时重复一次。如果你需要在不同的日子做不同的事情,就使用

switch(calendarObj.get(Calendar.DAY_OF_WEEK) { }

我们这里有解决办法吗?我仍在寻找解决方案,我的代码如下

calendar.set(Calendar.DAY_OF_WEEK,getweekday(obj));
    calendar.set(Calendar.HOUR_OF_DAY,timepicker.getCurrentHour());
    calendar.set(Calendar.MINUTE, timepicker.getCurrentMinute());
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    if(calendar.before(cal_now)){//if its in the past increment
        calendar.add(Calendar.DATE,1);
    }

PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(),_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 7, sender);
关于set(…)和setRepeating(…)方法的API页面状态如下:

“如果规定的触发时间是过去的,则报警将被触发 立即触发,报警计数取决于车辆行驶的距离 超过触发时间与重复间隔相对。”

因此,如果您在星期三,那么AlarmManager将触发以下事件:星期日、星期一、星期二和(可能)星期三。它实际上只会为所有人发射一枚

以下是我如何避免这种情况。我不确定这是不是最好的方法,但它工作得很顺利

假设您将要启动AlarmManager的一周中的、当天的小时分钟存储在以下变量中:

final int myAlarmDayOfTheWeek = ...;
final int myAlarmHour = ...;
final int myAlarmMinute = ...;
当然,这里我假设您使用相同的存储约定存储一周中的天,即:

星期天=日历。星期天=1

星期一=日历。星期一=2

星期六=日历

然后:


请避免每次计算日间隔(即24*60*60*1000),而是使用(或最多86400000)。

只需使用布尔值在共享首选项中注册今天的日期,并在第一次执行时将其设置为真。在重新启动期间,如果通知已送达,则忽略其他通知用户。第二天,只需删除旧的首选项并创建新的SharedReference值

public boolean isAlreadyWished(String date,String previousDate){
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
    if(sharedPref.contains(alreadyNotifiedString+previousDate)){
        sharedPref.edit().remove(alreadyNotifiedString+previousDate);
    }
    if(sharedPref.contains(alreadyNotifiedString+date)){
        boolean displayOrderString = sharedPref.getBoolean(alreadyNotifiedString+date, false);
        return  displayOrderString;
    }else{
        SharedPreferences.Editor editor=sharedPref.edit();
        editor.putBoolean(alreadyNotifiedString+date,true);
        return  false;
    }

}

谢谢但我不确定我是否理解。。。请问我怎样才能解决这个问题?非常感谢你。LisaUTC是GMT。如果你在伦敦以西的任何地方,你就在过去。根据需要将
日历
对象上的时区更改为UTC。非常感谢,我会这样做的。这有点违反直觉,因为即使今天是星期三,警报设置为星期一,这种情况也会发生!但是2013年7月的另一天,对不起,我还是不明白。谢谢Anyway@LisaAnne假设你得到了一年中第五周的日历实例,并且它是wWed。现在,当您将每周的第几天设置为星期一时。现在还是一年中的第五周。再次编辑。
final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timestamp.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, myAlarmPendingIntent);
public boolean isAlreadyWished(String date,String previousDate){
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
    if(sharedPref.contains(alreadyNotifiedString+previousDate)){
        sharedPref.edit().remove(alreadyNotifiedString+previousDate);
    }
    if(sharedPref.contains(alreadyNotifiedString+date)){
        boolean displayOrderString = sharedPref.getBoolean(alreadyNotifiedString+date, false);
        return  displayOrderString;
    }else{
        SharedPreferences.Editor editor=sharedPref.edit();
        editor.putBoolean(alreadyNotifiedString+date,true);
        return  false;
    }

}