天天看點

Android核心基礎-8.Android四大元件之Activity-2.關閉、傳遞資料8.2.1 關閉Activity8.2.2 傳遞資料

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();   
    }
}
           

示例源碼->百度網盤