显示跳转和隐式跳转
- 显示跳转
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();
}
});
}
}