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_IDConstants.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 的符号(找不到文件)

android intent 可以传递enum 吗

您无法移除所有正式版 APK 和 Android App Bundle

无法从 Windows 上的资产 index.android.bundle 加载脚本

Android onSaveInstanceState()恢复数据

运行时异常:ClassCastException android.os.Bundle 无法转换为 Parcelable 类