Android:无法保存和读取 Bundle 中的所有值
Posted
技术标签:
【中文标题】Android:无法保存和读取 Bundle 中的所有值【英文标题】:Android: Cannot save and read all values in the Bundle 【发布时间】:2016-04-10 20:47:12 【问题描述】:我有以下方法将三个值保存到附加到创建警报的意图中。
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。 “没什么”。
我试图从 Intent 和 Bundle 中获取值,但仍然没有成功。捆绑的物品数量不是有限的吗?
我怎样才能以正确的方式获得价值mOccurenceTime?
非常感谢您的建议。
【问题讨论】:
您是否为 ALARM_OCCURRENCE_TIME 分配了唯一值? 是的,它是硬编码的常量(键),但值可以不同或相同(基于变量值) 用于将值放入包中的键是否完全不同? (尤其是Constants.Global.ALARM_UNIQUE_ID
与Constants.Global.ALARM_OCCURRENCE_TIME
不同)
是,但具有相同的“前缀” alarm_unique_id AND alarm_exectime
只是为了确保:在文档( Intent.putExtras() )中,它提到了 Bundle:“密钥必须包含包前缀”。您的密钥是否以包名开头?
【参考方案1】:
这是正确的做法 - 指定一个标志!
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
而不是:
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);
因为标志的 0 会让你头疼
这可能是一个很常见的问题,因为 Google 的示例代码忽略了在警报中包含 Extra。
在这里解决:
android cannot pass intent extras though AlarmManager
【讨论】:
以上是关于Android:无法保存和读取 Bundle 中的所有值的主要内容,如果未能解决你的问题,请参考以下文章
iOS5 无法读取 Riven.bundle 的符号(找不到文件)
您无法移除所有正式版 APK 和 Android App Bundle
无法从 Windows 上的资产 index.android.bundle 加载脚本
Android onSaveInstanceState()恢复数据
运行时异常:ClassCastException android.os.Bundle 无法转换为 Parcelable 类