[英]Problems with multiple myIntent.putExtra/myIntent.getExtra in Android
好的,因此,我試圖從一個活動中,通過alarmManager到BroadcastReceiver(稱為AlarmReceiver)獲得兩個不同的String數組,到目前為止,我一直在使用myIntentName.putExtra()和相關的.getExtra()在東西。 這是我的相關代碼:
在第一個活動中(這被調用,代碼到達AlarmReceiver):
private void setAlarmManager() {
Intent intent = new Intent(this, AlarmReceiver.class);
//I have already defined askArray and answerArray (they aren't null, but are dynamic
//and exactly how I define them is quite complex so not included here)
intent.putExtra("askArray", askArray);
intent.putExtra("answerArray", answerArray);
PendingIntent sender = PendingIntent.getBroadcast(this, 2, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, 5000, 61000, sender);
}
在AlarmReceiver(擴展了BroadcastReceiver)的頂部:
String[] askArray = new String[2];
String[] answerArray = new String[2];
在broadcastReceiver中,在onReceive()中:
askArray = intent.getExtras().getStringArray("askArray");
answerArray = intent.getExtras().getStringArray("answerArray");
for (int i = 0; i < askArray.length; i++){ //I get a NullPointerException on this line
Log.i("L3R", "AskArray["+i+"]: " + askArray[i]);
}
您需要使用以下代碼從intent
獲取數組
askArray = intent.getStringArrayExtra("askArray");
answerArray = intent.getStringArrayExtra("answerArray");
大概在訪問askArray.length
時會收到NullPointerException,這意味着在嘗試遍歷數組之前檢查askArray == null
是否是一個好主意。 如果將這些值傳遞給BroadcastReceiver時發生錯誤,這將防止您的應用崩潰。
檢查getExtras()
返回任何有用的東西也是常見的做法,例如:
Bundle extras = intent.getExtras();
if(extras != null) {
askArray = extras.getStringArray("askArray");
answerArray = extras.getStringArray("answerArray");
if(askArray != null) {
for (int i = 0; i < askArray.length; i++) {
Log.i("L3R", "AskArray["+i+"]: " + askArray[i]);
}
}
} else {
Log.e("L3R", "Failed to getExtras()");
// deal with missing values here
}
如果這每次都記錄失敗消息,則問題可能與您設置intent
變量的方式有關。 看來您在“放入”數組之前已正確設置了它,但是“獲取”數組時如何設置它尚不清楚。 這應該是您在BroadcastReceiver中的代碼:
Intent intent = getIntent();
用這個
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
ContactItem contactData = (ContactItem) listView.getItemAtPosition(position);
Intent intent = new Intent(getActivity(), ContactDetail.class);
intent.putExtra("DATA_KEY", contactData);
startActivity(intent);
}
});
詳情
Intent i = getIntent();
Bundle b = i.getExtras();
// getting attached intent data
ContactItem contact = (ContactItem) b.getSerializable("DATA_KEY");
// displaying selected contact name
txtName.setText(contact.getName());
txtPhone.setText(contact.getPhone());
txtMobile.setText(contact.getMobile());
txtEmail.setText(contact.getEmail());
好的,很抱歉,但事實證明問題出在我發布的部分代碼中。 我正在使用一個警報管理器,該警報管理器我沒有意識到,但是感謝所有的答案,這里是鏈接: Android無法通過AlarmManager傳遞意圖附加功能
這是相關信息(從鏈接復制):
Haresh的代碼不是完整的答案...我使用了Bundle,但我嘗試了不使用Bundle的方法,但是當我嘗試從多余的字符串中獲取字符串時,我得到了空值!
在您的代碼中,確切的問題在於PendingIntent!
如果您嘗試傳遞額外的錯誤,這是錯誤的:
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);
因為標志的0會導致您頭疼
這是正確的方法-指定一個標志!
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
這可能是一個非常普遍的問題,因為Google的示例代碼被忽略了在警報中包括Extra。
也許這可以解決您的問題:
在廣播接收器變化的頂部場到這一點:
String[] askArray;
String[] answerArray;
就這樣。 祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.