Activity之间是如何进行跳转以及数据传递的呢
activity之间是通过intent进行activity之间的跳转的。
本文是在Activity创建、点击事件使用以及真机调试 基础上面进行补充添加的(所有的界面样式看个人喜欢自己添加)
1 Intent 介绍
Intent被称为意图,是程序中各组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
一般用于启动Activity、Service以及发送广播等。根据开启目标组件的方式不同,Intent被分为两种类型显示意图和隐式意图。
显式意图可以直接通过名称开启指定的目标组件。
隐式意图通过指定action和category等属性,系统根据这些信息进行分析后寻找目标Activity。
1.1 显示意图
Intent intent = new Intent(this, Activity02.class);
// 创建一个Intent对象,其中第1个参数为Context表示当前的Activity对象,第2个参数表示要启动的目标Activity。
startActivity(intent);
// 调用Activity的startActivity方法启动目标组件
在Test03项目中的MainActivity.java中的按钮的代码就是显示意图,代码如下。
Button btn = (Button)findViewById(R.id.btn1);
// 使用setOnClickListener()方法创建匿名内部类OnClickListener()当做参数传入,该方法适合按钮较少的情况
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 从主界面跳转到第二个界面
Intent intent1 = new Intent(MainActivity.this,MainActivity2.class);
startActivity(intent1);
}
});
显示意图可以通过三种方法创建
1.通过类名
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);
2.通过类名
Intent intent = new Intent();
intent.setClass(FirstActivity.this, cn.itcast.SecondActivity.class);
startActivity(intent);
3.通过字符串调用——解耦
Intent intent = new Intent();
intent.setClassName(FirstActivity.this,"cn.itcast.SecondActivity");
startActivity(intent);
1.2 隐式意图
首先在AndroidManifest.xml文件中给MainActivity2活动添加intent-filter标签。action标签设置action动作,当与代码中的action与该action相匹配时启动该组件(action名字自己随意取)。
在目标活动注册时,将其接受的Intent的action和category一并记录下来,
Action定义当前intent的动作,这里相当于将cn.itcast.ACTION_START action与本App的MainActivity2绑定了,任何App只要报上这个action都能将其打开。
系统中也定义了一些类似的action,如,ACTION_DIAL拨打电话界面
Category定义当前动作(Action)被执行的环境,如果不符合这个环境将无法激活,如,CATEGORY_DEFAULT ,默认环境,所有intent都能激活.
<activity android:name=".MainActivity2">
<intent-filter>
<action android:name="cn.itcast.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在activity_main.xml文件中再添加一个按钮3用于测试隐式意图。
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/btn3" android:text="点击3"
android:onClick="btn3Click"
android:layout_marginLeft="140dp"
android:layout_marginRight="140dp"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp">
</Button>
在MainActivity.java中,添加隐式意图代码
public void btn3Click(View view) {
Intent intent = new Intent();
// 设置action动作,当与清单文件中的action相匹配时启动目标组件。
intent.setAction("cn.itcast.START_ACTIVITY");
intent.addCategory("android.intent.category.DEFAULT");
// 使用隐式Intent时,注意action与category必须都匹配,否则程序会报错。
startActivity(intent);
}
另外,可使用隐式intent打开很多系统应用界面,如:系统浏览器、短信界面、拨号界面、联系人界面、各种系统设置界面。
既然Activity之间可以发生跳转,那么页面之间也是需要进行数据传递的,如何进行数据传递呢?
2 数据传递
2.1 使用putExtra()方法
Activity之间传递数据需要用到Intent提供的putExtra()方法。一个Activity进行传递数据,一个Activity进行数据接收。
在activity_main.xml文件中添加两个按钮,用于接收activity_main传递过来的数据
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击接收按钮1数据"
android:onClick="btn"
android:layout_marginLeft="140dp"
android:layout_marginRight="140dp"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp">
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击接收按钮2数据"
android:onClick="btn2Click"
android:layout_marginLeft="140dp"
android:layout_marginRight="140dp"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp">
</Button>
在MainActivity.java文件中的第一个按钮的setOnClickListener中补充如下代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 加载布局文件
setContentView(R.layout.activity_main);
// 通过findViewById()找到按钮,因为该方法返回的是View类型,所以需要进行强制转换为Button
Button btn = (Button)findViewById(R.id.btn1);
// 使用setOnClickListener()方法创建匿名内部类OnClickListener()当做参数传入,该方法适合按钮较少的情况
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 从主界面跳转到第二个界面
Intent intent1 = new Intent(MainActivity.this,MainActivity2.class);
intent1.putExtra("username","hello"); // putExtra()方法进行传递数据,注意这里传的是字符串,注意选择
intent1.putExtra("age",20); // 这里传的是数值,若是需要传递多个数据,就写多个putExtra()
startActivity(intent1);
}
});
}
在MainActivity2.java中补充如下代码,用于接收MainActivity的数据
public void btn(View view) {
Intent intent1 = getIntent();
// getIntent()用于接收数据,这里接收按钮1的传递数据
String username = intent1.getStringExtra("username");
Log.d("username",username);
// 将数据进行打印
int age = intent1.getIntExtra("age",0); // 后面的0是该方法的默认值,随意写
Log.d("age",String.valueOf(age)); // 这里因为接收的字符串,所以需要将数值转化成字符串
}
2.2 使用Bundle
在MainActivity2.java中添加如下代码
public void btn2Click(View view) {
//这里接收按钮3传递的数据
Bundle bundle = this.getIntent().getExtras();
String sex = bundle.getString("sex");
int score = bundle.getInt("score",0);
Log.d("sex",sex);
Log.d("score",String.valueOf(score));
}
2.3 真机调试
在Android Studio中点击运行,手机出现如下界面
接着点击“点击跳转1”按钮,跳转到第二个界面,如下图所示
然后点击“点击接收按钮1的数据”,在Android Studio的Logcat中可以看到打印出了第一个界面中的第一个按钮传递给第二个界面的数据,如下图所示
手机返回,点击“点击3”按钮,同样跳转到第二个界面,点击“点击接收按钮2的数据”,在Android Studio的Logcat中可以看到打印出了第一个界面中的第一个按钮传递给第二个界面的数据,如下图所示
- 本文作者: étoile
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!