程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> android-Android Intent 如何接收到指定的Intent傳遞過來的值呢?

android-Android Intent 如何接收到指定的Intent傳遞過來的值呢?

編輯:編程綜合問答
Android Intent 如何接收到指定的Intent傳遞過來的值呢?

寫了2個Activity,A、B,2個Activity之間可以相互跳轉。
1、A中有一個發送按鈕可實現傳值到B中,同時還有一個獨立的跳轉按鈕。
2、在B中有接收A傳值過來的的代碼
3、執行中,如果直接執行了跳轉按鈕,B的接收Intent代碼中,就會出現空指針異常,目前通過 try{}catch臨時確保能正常運行。
想請問:能否有方法可以讓B接收傳值的代碼能夠識別那個Intent才是傳值過來的,避免空指針異常出現。

A傳值代碼如下:
/*
* 1、獲取到界面中輸入的信息
* 2、將獲取到的值,傳遞到ReceiveActivity中。
* */
Button _OkSend = (Button)findViewById(R.id.buttonOkSend);
_OkSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText1 = (EditText)findViewById(R.id.editText);
name=editText1.getText().toString();
Log.i("YuryLog","SendActivity name: "+name);

            EditText editText2 = (EditText)findViewById(R.id.editText2);
            eatSomething = editText2.getText().toString();
            Log.i("YuryLog","SendActivity eatSomething: "+eatSomething);

            EditText editText3 = (EditText)findViewById(R.id.editText3);
            copies = editText3.getText().toString();
            Log.i("YuryLog","SendActivity copies: "+copies);

// 將值傳遞到ReceiveActivity中
Intent _intent = new Intent(SendActivity.this, ReceiveActivity.class) ;
_intent.putExtra("sendName",name);
_intent.putExtra("sendeatSomething",eatSomething);
_intent.putExtra("sendcopies",copies);

           startActivity(_intent);
        }
    });

B接收代碼如下:
// 接收SendActivity中傳遞過來的值;
// 需要確定,只有SendActivity中傳遞過來的值才能觸發,否則第一次執行的時候會出現空指針異常;
try {
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras().getString("sendName") != null){
Log.i("YuryLog","理論上只有點了確認鍵才執行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");

            Log.i("YuryLog",receiveName + receiveEatSomething + receiveCopies);
            //        在界面中顯示接收到的值
            //        獲取到TextView的id,再動態的更改它的值
            TextView _textView =(TextView) findViewById(R.id.textView4);
            TextView _textView2 =(TextView) findViewById(R.id.textView5);

            _textView.setText(receiveName+": ");
            _textView2.setText("來" + receiveCopies + "份" + receiveEatSomething);
        }
    }catch (Exception e){
        e.printStackTrace();
    }

萬分感謝各位能提供一個思路,謝謝。

最佳回答:


首先,盡量不要用try{}catch去捕捉能用判斷規避的異常,那樣會影響效率,每次出現異常,虛擬機要抓錯誤調用堆棧。所以,最好的方式是通過判斷去規避。
按你的思路,可以先判斷getIntent.getExtras()是否為null。
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras() != null){
Log.i("YuryLog","理論上只有點了確認鍵才執行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");
......

要指出的是,上述代碼,最好使用getXXXExtra這類方法,它不會出現空指針(除了少數幾個,比方說getStringExtra)。
需要設定默認值的,在沒有值時它會返回默認值;沒有設置默認值的,在沒有值時會返回null,針對這類判空一下。
可以看下getBooleanExtra的源碼:
public boolean getBooleanExtra(String name, boolean defaultValue) {
return mExtras == null ? defaultValue :
mExtras.getBoolean(name, defaultValue);
}

而getExtras()在沒有值時會返回null,看下源碼:
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}

所以,最好不要用getIntent().getExtras()這種方式,換用getIntent().getXXXExtras(),這樣針對有設置默認值的就不需要判空了。

activity之間傳值,是沒有機制可以確定哪個activity傳過來的。這是考慮到代碼的可擴展性,解耦。要確定哪個activity發過來,在intent創建那裡多傳個布爾值就行,比方說下面的代碼。
發送
intent.putExtra("fromXXActivity", true);

    接收
    if (getIntent().getBooleanExtra("fromXXActivity", false)) {
        ......
                    // 這裡,你就可以安全的接收那個activity發過來的所有值。
    }
qq_30402261
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved