使用Intent进行页面跳转Intent是一个将要执行的动作的抽象的描述,
一般来说是作为参数来使用,由 Intent来协助完成 Android各个组件之间的通讯。
使用方法:作用:
作用一:完成activity之间的跳转、传参
这传参也有几种类型,如下:
第一种.从当前activity跳转到另一个activity:
//参数1 为当前的 activity,参数 2 为:要跳转的activity的类对象
Intent intent =new Intent(MainActivity.this,ToActivity.class);
startActivity(intent);
第二种.从当前activity跳转到另一个activity并传参:
当前activity:为MainActivity,代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt=findViewById(R.id.bt_tiaozhuan);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,ToActivity.class);
//==设置值 键值对形式,可传多种类型,这里举一些例子
//string
intent.putExtra("string","为String类型");
//int
intent.putExtra("int",10);
//bean类 这个bean类,会在下文解释
TestBean testBean=new TestBean();
testBean.setAge(11);
testBean.setName("小明");
intent.putExtra("testBean",testBean);
startActivity(intent);
}
});
}
}
要跳转的activity:ToActivity,代码如下:
public class ToActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_to);
Intent intent=getIntent();
//==获取参数
String string=intent.getStringExtra("string");
int it=intent.getIntExtra("int",0); //参数2:要设置该int类型的默认值
/**因为该bean类是实现Parcelable,所以用getParcelableExtra获取,
如果是该bean是实现Serializable ,就用getSerializableExtra获取
*/
TestBean testBean=intent.getParcelableExtra("testBean");
}
}
ps:关于TestBean,在Android里,传参的bean类,实现Parcelable 比实现 Serializable 效率高,具体自行查找相关资料,
下面用 TestBean 来做例子,实现 Parcelable 的操作,代码如下:
/**实现Parcelable后,移到报错线,点击提示框左边的Add...将生成以下方法
TestBean、writeToParcel、describeContents和 Creator<TestBean> CREATOR
*/
public class TestBean implements Parcelable {
private int age;
private String name;
public TestBean() {
}
protected TestBean(Parcel in) {
age = in.readInt();
name = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<TestBean> CREATOR = new Creator<TestBean>() {
@Override
public TestBean createFromParcel(Parcel in) {
return new TestBean(in);
}
@Override
public TestBean[] newArray(int size) {
return new TestBean[size];
}
};
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第三种.下一个activity 传参到上一个 activity
上一个activity:MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt=findViewById(R.id.bt_tiaozhuan);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Step 1 :执行跳转
Intent intent =new Intent(MainActivity.this,ToActivity.class);
/*
参数2为识别码,等于onActivityResult方法的requestCode,
作用是:是当前activity标记的识别码,当跳转到下一个activity后做其该做的事后并finnish,
此时上一个activity(也就是当前activity)会的onActivityResult方法会执行,其参数requestCode就等于识别码。
*/
startActivityForResult(intent,1);//等于 当前activity对象.startActivityForResult(intent,1),
}
});
}
/**Step 2 :重写onActivityResult 方法,如下:
该方法作用为:当下一个activity关闭(finish())掉后,就执行该方法:
* @param requestCode 当前activity(MainActivity)设置跳转到下一个activity时的识别码,
* @param resultCode 为下一个activity传回的结果码,
* @param data 一个activity传回上一个activity的值。
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==1){//requestCode:判断是否是当前的activity(MainActivity)设置的识别码
if (resultCode == 2) {//resultCode:判断是否是下一个activity(ToActivity)传过来的结果码
//获取下一个activity传过来的参输
String name = data.getStringExtra("name");
}
}
}
}
下一个activity:ToActivity
public class ToActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_to);
Button bt=findViewById(R.id.bt_finish);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
//设置值(键值对形式)
intent.putExtra("name","小明");
//参数1为传值回上一个activity时的结果码
setResult(2,intent);//等于setResult(Activity.RESULT_OK,intent);
finish();
}
});
}
}
tip:activity之间传参还可以借助bundle来实现:
例传参的activity代码如下:
Bundle bundle=new Bundle();
bundle.putInt("int",123);
bundle.putString("string","小明");
Intent intent=new Intent(MainActivity.this,ToActivity.class);
intent.putExtras(bundle);
startActivity(intent);
接受的activity代码如下:
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
int it=bundle.getInt("int");
String str=bundle.getString("string");
但是,当要传多个bundle时:
传参的activity:
Bundle bundle=new Bundle();
bundle.putInt("int",123);
bundle.putString("string","小明");
Bundle bundle2=new Bundle();
Intent intent=new Intent(MainActivity.this,ToActivity.class);
intent.putExtra("bundle",bundle);
intent.putExtra("bundle2",bundle2);
startActivity(intent);
接受的activity
Intent intent=getIntent();
Bundle bundle=intent.getBundleExtra("bundle");
Bundle bundle2=intent.getBundleExtra("bundle2");
int it=bundle.getInt("int");
String str=bundle.getString("string");
作用二:调用应用程序
例一:调用电话界面并输入号码:
//tel: 固定写法,后面接着写号码。
Uri uri=Uri.parse("tel:10086");
Intent intent=new Intent(Intent.ACTION_DIAL,uri);
startActivity(intent);
例二:跳转到该应用的设置界面:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
例三:跳转到网站(浏览器打开):
Uri uri=Uri.parse("https://www.baidu.com/");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);