为什么BroadcastReceiver在过去的时间初始化?

时间:2015-09-23 05:57:26

标签: java android android-intent broadcastreceiver android-broadcast

我正在创建一个应用程序:

  1. 用户输入的时间范围...(初始时间最终时间)假设用户提供(06:00 PM至07:00 PM)
  2. 当手机的当前时间等于初始时间时,手机的静音模式会激活。
  3. 如果时间范围是未来的话,一切正常(如果我的电话时间在 05:00 PM 之前):

    1. 假设我的手机当前手机时间 08:00 PM ,我的时间范围是(06:00 PM到07:00 PM)。然后手机的静音模式在我当前时间(08:00 PM)激活。它应该在第二天激活......
    2. 我为此做了一个服务......

      每当用户输入时间范围时,它就会启动onStart服务并覆盖onStartCommand ......

      public void onStart(Intent intent, int startId) {
          super.onStart(intent, startId);
      
          ArrayList<HashMap<String, String>> arraylist_start = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("arraylist_start");
      
          if(arraylist_start != null){
              try {
                  silentModeOnBroadCastReceiver.startAlarmAt(this, arraylist_start);
                  silentModeOffBroadCastReceiver.startAlarmOff(this, arraylist_start);
              } catch (ParseException e) {
                  e.printStackTrace();
              }
          }
      }
      

      在arraylist_start中,我从意图中获取时间范围列表,其中用户添加了时间范围...相同的代码写在onStartCommand

      在SilentModeOnBroadCastReceiver中,我添加了startAlarmAt方法,该方法接受ArrayList并调用挂起的意图

      public void startAlarmAt(Context context, ArrayList<HashMap<String, String>> list) throws ParseException {
          Calendar calendar = Calendar.getInstance();
          for (int j = 0; j < list.size(); j++ ){
              SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
      
      
              String timeStart = list.get(j).get("timeStart");
              date1 = Calendar.getInstance();
              date2 = Calendar.getInstance();
      
              date1.setTime(dateFormat.parse(timeStart));
              Log.i("Date1Time", date1.toString());
      
              int hours = date1.get(Calendar.HOUR_OF_DAY);
              int minutes = date1.get(Calendar.MINUTE);
      
              calendar.set(Calendar.HOUR_OF_DAY, hours);
              calendar.set(Calendar.MINUTE, minutes);
              calendar.set(Calendar.SECOND, 0);
              calendar.set(Calendar.MILLISECOND, 0);
      
              AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
              Intent i = new Intent(context, SilentModeOnBroadCastReceiver.class);
              PendingIntent pi = PendingIntent.getBroadcast(context, j, i, PendingIntent.FLAG_UPDATE_CURRENT);
              am.setRepeating(AlarmManager.RTC_WAKEUP, date1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
          }
      }
      

      现在在SilentModeOnBroadCastReceiver

      public void onReceive(Context context, Intent intent)
      {
          PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
          PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
          wl.acquire();
      
      
          // Put here YOUR code.
          Toast.makeText(context, "Silent Activated !!!!!!!!!!", Toast.LENGTH_LONG).show();
          Silent silent = new Silent(context);
      
          silent.activateAudioMode(AudioManager.RINGER_MODE_SILENT);
      
          wl.release();
      }
      

      请帮助解决我的问题...为什么BroadcastReceiver会在过去的时间初始化?

3 个答案:

答案 0 :(得分:1)

此行为的原因是Android没有将其调用到确切的时间(除了您设置了一些特殊标志)。 Android正在这样做,以提高电池使用率。这导致Android尝试尽快为给定的属性集调用该警报侦听器。由于你的时间窗口已经启动,因此Android调用它的时间较晚,所以它做得最好并且几乎直接调用它。

因此,只需检查窗口是否在过去,如果是,请为第一次调用添加一天。我也在我的应用程序中这样做,并且它工作正常。

您可以通过以下简单的电话添加一天:

if(calendar.before(GregorianCalendar.getInstance())) {
   calendar.add(Calendar.DAY_OF_MONTH, 1);
}

答案 1 :(得分:1)

这种情况正在发生,因为您正在为已经过去的时间设置闹钟。因此android在当前时间初始化广播接收器。您需要签入代码...如果时间已过,请将其设置为第二天。

在设置闹钟之前进行此检查:

if(alarm_time_in_ms < System.getCurrentTimeMillis())
{
   calendar.add(Calendar.DAY_OF_MONTH, 1);
}

希望它有所帮助!

答案 2 :(得分:1)

它似乎正在做的是获取当前时间并为此设置警报。我认为你需要做的是获取当前时间(现在)并获得警报时间(alarm_time)。你需要考虑设置时也是如此,因为如果用户设置alarm_time = 06:00AM,现在是12:46 PM,则需要为警报添加一天。