8.2.1 關閉Activity
系統提供了finish()來關閉Activity,我們按back鍵就調用了該方法關閉Activity。但是一般應用的主界面不會一按back鍵就關閉,是以我們要重寫finish();
- 方法一:彈出确認對話框
- 方法二:彈出一個吐司
@Override
public void finish() { // 重寫finish(), 在退出的時候彈出對話框
//方法一、
// new AlertDialog.Builder(this).setTitle("确定要退出嗎?").setPositiveButton("确定", new OnClickListener() {
//
// @Override
// public void onClick(DialogInterface dialog, int which) {
// MainActivity.super.finish(); // 如果點選确定按鈕, 執行父類的finish(), 真正退出
// }
// }).setNegativeButton("取消", null).show();
//方法二、
if (System.currentTimeMillis() - previous < ) {
super.finish();
} else {
previous = System.currentTimeMillis();
Toast.makeText(getApplicationContext(), "再按一次退出", Toast.LENGTH_SHORT).show();
}
}
注意:Builder是AlertDialog的内部類,是以不能直接super.finish();而要MainActivity.super.finish();才能将目前MainActivity關閉。
8.2.2 傳遞資料
8.2.2.1 啟動時傳遞資料
- Intent可以使用putExtra()方法裝入資料(鍵值對)
- 新Activity中getIntent()之後, 可以調用getStringExtra(), getIntExt()擷取資料
- 可傳遞資料類型: 基本資料類型, String, Bundle, Serializable, Parcelable
//1.基本數組類型
public void sendData(View v) {
Intent intent = new Intent(this, OtherActivity.class);
intent.putExtra("name", "張三"); // 向Intent中裝入資料, String
intent.putExtra("age", ); // 基本資料類型及數組
startActivity(intent); // 啟動Activity, Intent會把資料攜帶過去
}
//1.接收
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",);//指定一個預設值
//2.傳遞自定義對象
// 可以序列化(把Object轉為byte[])
Person person = new Person("李四",);
intent.putExtra("p",person);//如果需要傳輸自定義對象,該類必須實作Serializable接口Public class Person implements Serializable{...}也可以傳遞集合,集合預設都實作了該接口,但其傳遞的對象都必須實作該接口:如ArrayList<Person>
//2.接收
Person p = (Person)intent.getSerializableExtra("p");
//3.傳遞一個Bundle
Bundle bundle = new Bundle();
bundle.putString("name","王五");//傳遞一個Bundle(其就是一個Map集合)
bundle.putInt("age",);
intent.putExtra("bundle",bundle);
//3.接收
Bundle bundle = intent.getBundleExtra("bundle");
String name = bundle.getString("name");
int age = bundle.getInt("age");
//4.傳遞自定義對象
Person person = new Person("李四",);
intent.putExtra("p",person);//person要實作Parcelable接口,其要實作的方法
->
@Override
public int describeContents() {
return ;
}
@Override
public void writeToParcel(Parcel parcel, int flags) { // 定義怎麼把Person對象寫入Parcel
parcel.writeString(name);
parcel.writeInt(age);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { // 用來從Parcel中擷取Person
public Person createFromParcel(Parcel parcel) { // 定義怎麼從Parcel中擷取資料, 建立Person
return new Person(parcel.readString(), parcel.readInt());
}
public Person[] newArray(int size) {
return new Person[size];
}
};
//具體寫法,可以參考Android系統的android.graphics.Point(之是以推薦看這個,因為這個類就x,y兩個字段)
// Parcelable在綁定服務的時候有用
//4.接收
Person p = intent.getParcelableExtra("p");
//實作Serializable接口時一般會給類定義一個版本号,當類要被反序列化時,傳回到對應的版本号的類版本
private static final long serialVersionUID = L;
程序之間可傳遞資料的:1.序列化;2.郵包
Activity有可能跨程序傳遞資料,可用:1.序列化Serializable;2.郵包Parcelable
綁定服務必須用郵包;Service隻能用1.郵包Parcelable
8.2.2.2 關閉時傳回資料
- 如果希望新的Activity可以傳回資料, 那麼就需要使用startActivityForResult()方法來啟動Activity
- 在新的Activity中調用setReuslt()方法設定要傳回的資料
- finish()之後, 原Activity會自動調用onActivityResult(), 該方法的形參就是setReuslt()設定的資料
發送資料到OtherActivity
public void getResult100(View v) {
Intent intent = new Intent(this, OtherActivity.class);
Person p = new Person("李四", );
intent.putExtra("p", p);
startActivityForResult(intent, ); // 1.啟動新的Activity, 并等待結果
}
public void getResult101(View v) {
Intent intent = new Intent(this, OtherActivity.class);
Person p = new Person("李四", );
intent.putExtra("p", p);
startActivityForResult(intent, ); // 1.啟動新的Activity, 并等待結果
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { // 3.這個方法會在新Activity關閉後執行
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", -);
TextView mainTV = (TextView) findViewById(R.id.mainTV);
mainTV.setText(name + ": " + age);
/*
* requestCode: 代表從哪裡啟動的Activity
* resultCode: 代表哪個Activity關閉之後傳回的資料
*/
Toast.makeText(getApplicationContext(), requestCode + ", " + resultCode, Toast.LENGTH_SHORT).show();
}
OtherActivity調用finish關閉時傳回資料給MainActivity
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
Intent intent = getIntent(); // 擷取Intent
Person p = intent.getParcelableExtra("p");
intent.putExtra("name", "趙六");
intent.putExtra("age", );
setResult(, intent); // 2.設定結果資料, 在finish()之後, 結果資料就會傳遞到onActivityResult()方法
}
public void close(View v) {
finish();
}
}
示例源碼->百度網盤