3

我有以下方法将三个值保存到附加到创建的警报的意图中。Android:无法保存并读取包中的所有值

public static Boolean setUniqueAlarm(Long alarmId, String occurenceTime, Context context) { 
     Boolean saveResult = null; 
     try { 
      DateTime dt = TimeHelper.getDateTimeObject(occurenceTime); 
      Logger.d("Year: " + dt.getYear() + ", month: " + dt.getYear() + ", day: " + dt.getDayOfMonth() + ", hour: " + dt.getHourOfDay() + ", minute: " + dt.getMinuteOfHour()); 
      Logger.d("Occurrence time to save: "+occurenceTime); 
      AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
      Intent alarmIntent = new Intent(context, AlarmBroadcastReceiver.class); 
      // Pass the intent type and other additional values into bundle 
      Bundle bundle = new Bundle(); 
      bundle.putString(Constants.Global.ALARM_TYPE, Constants.Global.ALARM_TYPE_UNIQUE); 
      bundle.putString(Constants.Global.ALARM_OCCURRENCE_TIME, "123456"); 
      bundle.putLong(Constants.Global.ALARM_UNIQUE_ID, alarmId); 
      alarmIntent.putExtras(bundle); 
      PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 
      alarmManager.set(AlarmManager.RTC_WAKEUP, dt.getMillis(), pendingAlarmIntent); 
      saveResult = true; 
     } catch (Exception e) { 
      Logger.e(e.getMessage()); 
      saveResult = false; 
     } 
     return saveResult; 
    } 

在接收机我已经以下代码:

@Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      Logger.d("ALARM RECEIVED!!!"); 
      PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
      // Device battery life will be significantly affected by the use of this API. 
      PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG"); 
      // Acquire the lock 
      wl.acquire(); 
      //Release the lock 
      wl.release(); 
      // Get the intent type (or stored variables) 
      Bundle extras = intent.getExtras(); 
      mAlarmType = extras.getString(Constants.Global.ALARM_TYPE); 
      mAlarmId = extras.getLong(Constants.Global.ALARM_UNIQUE_ID, 0); 
      mOccurenceTime = extras.getString(Constants.Global.ALARM_OCCURRENCE_TIME, "nothing"); 
      triggerActionBasedOnTheAlarmType(mAlarmType, mAlarmId, mOccurenceTime, context); 
     } catch (Exception e) { 
      TrackingEventLogHelper.logException(e, Constants.Global.EXCEPTION, 
        Constants.ExceptionMessage.EXC_CANNOT_PROCESS_RECEIVED_ALARM, true); 
     } 
    } 

问题是,可变mOccurenceTime始终为空,RSP。 “没有”。

我试图从意图和Bundle中获取值,但仍然没有成功。项目捆绑计数是否有限?

如何才能以正确的方式获得价值mOccurenceTime

非常感谢您的任何建议。

+0

你分配给ALARM_OCCURRENCE_TIME的独特价值? – Blackbelt

+0

是的,它是硬编码常量(键),但值可以不同或相同(基于变量值) – redrom

+0

是用来将值全部区分的键吗? (特别是'Constants.Global.ALARM_UNIQUE_ID'不同于'Constants.Global.ALARM_OCCURRENCE_TIME') – njzk2

回答

0

这是正确的做法 - 指定一个标志!

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

取而代之的是:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0); 

因为0的标志是什么将导致你头疼

这可能是这样一种流行的问题,因为谷歌的代码示例忽略了包括额外的在一个闹钟。

这里解决:

Android cannot pass intent extras though AlarmManager