顯示跳轉和隐式跳轉
- 顯示跳轉
public void onClick(View view) {
//Intent intent = new Intent();
//顯式1
//intent.setClass(AActivity.this,BActivity.class);
//顯式2
//intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
//顯式3
//intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
//顯式4,最常用
Intent intent = new Intent(AActivity.this,BActivity.class);
startActivity(intent);
}
- 隐式跳轉
- 在activity.java中如下設定,記住setAction中的字元串
Intent intent = new Intent()
intent.setAction("com.b.jump");
startActivity(intent);
- 在AndroidManifest檔案中要跳轉到的目标activity标簽中添加如下子标簽,action中的name屬性值就是之前setAction中寫的那個。category的name值也要做如下修改
<intent-filter>
<action android:name="com.b.jump" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
intent.setAction還可以調用一些系統的元件,比如打電話,發郵件,攝像頭等等
activity之間的資料傳遞
-
資料的綁定:Bundle類
通過put對應的方法綁定資料,資料是鍵值對的形式綁定的,綁定的資料可以是各種類型string/int/數組等等,比如
void putString( String key,String value);
void putInt( String key, int value) ;
- bundle設定到intent
- intent.putExtra(key,value): 給bundle綁定一個key,鍵值對的形式放進去,相應的讀取時就用intent.getExtra(key)
- inten.putExtras(bundle):這樣可以直接放bundle進去,讀取的時候就用intent.getExtras()方法
//綁定資料
Bundle bundle = new Bundle();
bundle.putString("name","德華");
bundle.putInt("age",18);
//将bundle放進intent中
intent.putExtras(bundle);
startActivity(intent);
-
資料的讀取
讀取的方法根據綁定的時候用的方法來
Button btnB = findViewById(R.id.btn_b);
//擷取intent
Intent intent = getIntent();
//擷取bundle
Bundle bundle = intent.getExtras();
//擷取綁定資料
String name = bundle.getString("name");
int age = bundle.getInt("age");
startActivityForResult:啟動Activity,結束後傳回結果
前面的是跳轉時綁定資料,而這裡是按傳回鍵時綁定資料到另一個頁面,不同的需求。
-
startActivityForResult(Intent, int)
第一個參數Intent,和普通的startActivity()裡的Intent一樣,裡面放要請求的Activity和可能需要放的資料。
第二個參數int,是一個請求代碼,整型的,這個可以自己随便定義,但這個數要大于等于0才行。因為MainActivity有可能會跳轉到多個頁面,如果這幾個頁面使用完之後,都需要傳回一些資訊,那麼就必須要有個辨別符來表示傳回來過的是哪個頁面的資訊。
-
setResult(int),setResult(int, Intent)
第一個參數int,是一個傳回代碼,整型的,這個也是自己随便定義,用來表示這個頁面執行之後是個什麼情況,是成功還是失敗了,還是其它什麼的,反正傳回一個整型數,自己知道它的含義就行了。這個資料在Activity類中有常量可以用。
第二個可選參數是一個Intent,可以用來存放資料。
-
void onActivityResult(int requestCode, int resultCode, Intent data)
這個方法是請求的Activity完成任務被finish()之後,會調用這個,前提是,你啟動那個Activity是通過startActivityForResult()來啟動的。
第一個參數int,是請求代碼,就是startActivityForResult()裡面的請求代碼。
第二個參數int,是傳回代碼,就是setResult()方法裡面的設定的參數。
第三個參數Intent,就是setResult(int, Intent)裡面的放置資料的Intent。
案例
- AActivity初始頁面:
package com.example.test.jump;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.test.R;
import com.example.test.util.ToastUtil;
public class AActivity extends AppCompatActivity {
private Button btnA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
btnA = findViewById(R.id.btn_a);
btnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Intent intent = new Intent();
//顯式1
//intent.setClass(AActivity.this,BActivity.class);
//顯式2
//intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
//顯式3
//intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
//顯式4,最常用
// Intent intent = new Intent(AActivity.this,BActivity.class);
//隐式跳轉,需要在AndroidManifest檔案中配置
Intent intent = new Intent();
intent.setAction("com.b.jump");
//綁定資料
Bundle bundle = new Bundle();
bundle.putString("name","德華");
bundle.putInt("age",18);
//将bundle放進intent中
intent.putExtras(bundle);
// startActivity(intent);
//另一種跳轉方式,附帶請求碼,等轉發過去的頁面finish的時候綁定的資料也會帶着這個碼,就知道資料是要傳給這個頁面的
startActivityForResult(intent,0);
}
});
}
/**
* 當跳轉到的頁面finish時就會觸發這個方法,在裡面可以得到傳過來的資料
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ToastUtil.showMsg(AActivity.this,data.getExtras().getString("B"));
}
}
- BActivity:跳轉到的頁面
package com.example.test.jump;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.test.R;
import com.example.test.util.ToastUtil;
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_b);
Button btnB = findViewById(R.id.btn_b);
//擷取intent
Intent intent = getIntent();
//擷取bundle
Bundle bundle = intent.getExtras();
//擷取綁定資料
String name = bundle.getString("name");
int age = bundle.getInt("age");
ToastUtil.showMsg(BActivity.this,"A中綁定的資料:"+name+":"+age);
btnB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
Bundle bundle1 = new Bundle();
bundle1.putString("B","B中綁定的資料");
intent.putExtras(bundle1);
setResult(Activity.RESULT_OK,intent);
//finish用于結束Activity的生命周期,會調用onDestroy方法.其結果和使用者按下傳回鍵是一樣的
finish();
}
});
}
}