簡體   English   中英

Android中多個myIntent.putExtra / myIntent.getExtra的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM