日報2015/10/11(極客學院安卓視頻學習)

在 Activity 跳轉過程中的生命週期

總結了一下:

從A跳到B,A onPause()後不會馬上執行onStop(),而是要等到
B onCreate(),onStart(),onResume() 之後再執行onStop()
若是B沒有完全遮擋住A,例如B是一個dialog的話,onStop() 便不會執行了。

在 Activity 之間傳遞參數

從MainActivity通過Intent跳轉到B,需要
new Intent(MainActivity.this,B.class)
而B中可以通過getIntent() 來取得它們之間這個橋樑Intent,並且取到保存的鍵值對參數。

Bundle對象獲取字符串的時候有一個重載的方法:

getString("鍵名","若不存在時的默認值")

這樣若是Bundle中沒有這個key的value,則取出的是默認值。

與Intent對應的取值:
putExtra("key",Bundle)getBundleExtra("key")
putExtras(Bundle)getExtras()

傳遞值對象

如果不對對象進行任何處理,那麼

intent.putExtra("user",new User("jackie",21));

所以,應該對實體對象進行處理:兩種方式

1implements Serializable

A:intent.putExtra("user",new User("jackie",21));
B:intent.getSerializableExtra("user");//此處注意是Serializable

2implements Parcelable

User類要重寫兩個方法,其中

@Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

parcelable沒有自動序列化的機制需要我們手動實現,如上

另外,還要在User裏寫一個

public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

A:intent.putExtra("user",new User("jackie",21));
B:intent.getParcelableExtra("user");//此處注意是Parcelable

後者是安卓爲開發者提供的序列化方法,不使用系統序列化機制,速度較快,雖然操作複雜了些。

獲取 Activity 的返回參數

在B的按鈕處:使用setResult() 方法,並且新聲明一個intent

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.putExtra("BName",editText.getText().toString());
                setResult(1,intent);
            }
        });

而在A中,要想接收到返回值就不能通過startActivity(intent);
要使用startActivityForResult(intent,0);//0表示一種兩者交互的行爲
並且A中要重寫一個方法來對返回數據進行處理

onActivityResult(int requestCode, int resultCode, Intent data)

這裏的data就是B中返回的那個intent,那麼通過它就能取到B中EditText的值

String name=data.getStringExtra("BName");
textView.setText(name);

也就是說關鍵在於(限於幅面參數省略)
A:startActivityForResult(),onActivityResult()
B:setResult();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章