启动
Activity
传数据
获取返回值
创建 MyActivity2
在项目ActivitySample
中模仿创建MyActivity1
的步骤,创建一个新的 Activity
名为 MyActivity2
;
创建布局文件 activity_my2.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="30dp">
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" button 2" />
</LinearLayout>
加载布局文件
Java 代码 MyActivity2
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my2);
}
Kotlin 代码 MyActivity2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my2)
}
在 AndroidManifest.xml
清单文件中注册 MyActivity2
<activity android:name=".MyActivity2" />
<activity
android:name=".MyActivity1"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
启动 MyActivity2
我们通过MyActivity1
来启动MyActivity2
:
编辑布局文件 activity_my1.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="30dp">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="close button"
android:textAllCaps="false" />
<Button
android:id="@+id/startBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start activity"
android:textAllCaps="false" />
</LinearLayout>
增加了一个 id
为 startBtn
的 Button
.
启动 MyActivity2
编辑MyActivity1
代码:
Java 代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my1);
Button button = findViewById(R.id.btn1);
button.setOnClickListener(view -> {
Toast.makeText(this, "close activity", Toast.LENGTH_SHORT).show();
finish();
});
Button start = findViewById(R.id.startBtn);
start.setOnClickListener(view -> {
Intent intent = new Intent(this, MyActivity2.class);
startActivity(intent);
});
}
Kotlin 代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my1)
val button: Button = findViewById(R.id.btn1)
button.setOnClickListener{
Toast.makeText(this, "close activity", Toast.LENGTH_SHORT).show()
finish()
}
val start: Button = findViewById(R.id.startBtn)
start.setOnClickListener{
val intent = Intent(this, MyActivity2::class.java)
startActivity(intent)
}
}
这里是为按钮 startBtn
设置了点击事件,点击按钮跳转到MyActivity2
,通过调用 Activity
的 startActivity()
函数实现跳转功能;
startActivity()
函数接收一个 Intent
作为参数;
Intent
的构造函数Intent(Context packageContext, Class<?> cls)
接收两个参数:第一个 Context
作为启动 Activity
的上下文,第二个参数 Class
用于指定要启动的 Activity
。
运行效果
MyActivity1
:
点击 按钮 跳转到MyActivity2
传递数据
Intent
不但可以启动 Activity
,还可以在启动 Activity
的时候传递数据。
编辑布局文件 activity_my1.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="30dp">
.....
<Button
android:id="@+id/sendBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="send message"
android:textAllCaps="false" />
</LinearLayout>
增加了一个 id
为 sendBtn
的 Button
.
启动 MyActivity2
编辑MyActivity1
代码:
Java 代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my1);
......
Button send = findViewById(R.id.sendBtn);
send.setOnClickListener(view -> {
Intent intent = new Intent(this, MyActivity2.class);
intent.putExtra("nick","guagua");
intent.putExtra("age", 19);
startActivity(intent);
});
}
Kotlin 代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my1)
......
val send: Button = findViewById(R.id.sendBtn)
send.setOnClickListener{
val intent = Intent(this, MyActivity2::class.java)
intent.putExtra("nick", "guagua")
intent.putExtra("age", 19)
startActivity(intent)
}
}
我们使用 Intent
的 putExtra()
函数进行数据的传递;
putExtra()
函数有两个参数:第一个是数据的名称(键),是String
类型,第二个参数是要传递的数据。
编辑布局文件 activity_my2.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="30dp">
<TextView
android:id="@+id/message_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="message"/>
.....
</LinearLayout>
这里增加了一个 TextView
是用来展示传递的数据。
获取数据
编辑MyActivity2
代码:
Java 代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my1);
TextView tv = findViewById(R.id.message_tv);
Intent intent = getIntent();
if (intent.hasExtra("nick")) {
String nick = intent.getStringExtra("nick");
tv.setText("nick: "+nick);
}
if (intent.hasExtra("age")) {
int age = intent.getIntExtra("age", 0);
tv.append("\nage: "+age);
}
}
getIntent()
函数是 Activity
类的函数,用于获取启动 MyActivity2
的 Intent
.
Kotlin 代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my1)
val tv: TextView = findViewById(R.id.message_tv)
if (intent.hasExtra("nick")) {
val nick = intent.getStringExtra("nick")
tv.text = "nick: $nick"
}
if (intent.hasExtra("age")) {
val age = intent.getIntExtra("age", 0)
tv.append("\nage: $age")
}
}
这里是获取传递过来的数据,用 TextView
展示出来。
intent
是调用父类的getIntent()
函数,获取启动 MyActivity2
的 Intent
;
使用Intent
的 hasExtra()
函数来判断是否有对应的数据传递过来;
Intent
的 getStringExtra()
函数用于获取传递的 String
类型的数据;
Intent
的 getIntExtra()
函数用于获取传递的 int
类型的数据;
运行项目
点击MyActivity1
的 send message
按钮,跳转至MyActivity2
页面:
向下一个 Activity
查询数据
可以传递数据给下一个 Activity
,还可以向下一个 Activity
查询数据。
编辑布局文件 activity_my1.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="30dp">
.....
<Button
android:id="@+id/requestBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="request message"
android:textAllCaps="false" />
</LinearLayout>
增加了一个 id
为 requestBtn
的 Button
.
启动下一个 Activity
编辑MyActivity1
代码:
Java 代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my1);
......
Button req = findViewById(R.id.requestBtn);
req.setOnClickListener(view -> {
Intent intent = new Intent(this, MyActivity2.class);
startActivityForResult(intent, 1010);
});
}
Kotlin 代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my1)
......
val req: Button = findViewById(R.id.requestBtn)
req.setOnClickListener{
val intent = Intent(this, MyActivity2::class.java)
startActivityForResult(intent, 1010)
}
}
这里调用 startActivityForResult()
函数来启动 MyActivity2
,该函数有两个参数:第一个是用于启动 Activity
的 Intent
,第二个参数是请求码,用于标记请求的来源。
处理请求,返回数据给上一个 Activity
编辑MyActivity2
代码:
Java 代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my1);
......
Button button = findViewById(R.id.btn2);
button.setOnClickListener(view -> {
Intent result = new Intent();
result.putExtra("data", " 🐸 shaguaAndroid!");
setResult(RESULT_OK, result);
finish();
});
}
Kotlin 代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my2)
......
val button: Button = findViewById(R.id.btn2)
button.setOnClickListener{
val result = Intent()
result.putExtra("data", " 🐸 shaguaAndroid!")
setResult(RESULT_OK, result)
finish()
}
}
这里是点击按钮,将数据返回,并关闭当前页面MyActivity2
;
构建了一个名为 result
的Intent
用于传递数据;
调用 setResult()
函数向上一个 Activity
返回数据,该函数接受两个参数:第一个是处理结果,一般用 RESULT_OK
或 RESULT_CANCELED
表示,第二个参数是Intent
用于携带返回数据;
函数 finish()
关闭当前页面MyActivity2
.
获取返回数据
回到MyActivity1
中并编辑,覆写函数 onActivityResult()
,
Java 代码
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (RESULT_OK != resultCode) return;
if (1010 == requestCode && null != data) {
String value = data.getStringExtra("data");
Log.i("MyActivity1", "onActivityResult(" + requestCode + "), result value: " + value);
}
}
Kotlin 代码
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (RESULT_OK != resultCode) return
if (1010 == requestCode) {
val value = data?.getStringExtra("data")
Log.i("MyActivity1", "onActivityResult($requestCode), result value: $value")
}
}
这里是获取返回数据,并输出日志。
函数 onActivityResult()
用于获取返回数据,它有三个参数:第一个是启动 Activity
时传入的请求码,第二个参数是返回数据时传入的处理结果,第三个参数是携带返回数据的Intent
。
运行项目
点击按钮 request message
启动MyActivity2
,点击新页面中的按钮返回,查看Logcat
日志台:
项目代码地址
Java:
https://github.com/BethelDEV/shaguaAndroid/tree/main/javaSource/ActivitySampleKotlin:
https://github.com/BethelDEV/shaguaAndroid/tree/main/kotlinSource/ActivitySample