Intent
定义:一种轻量级的消息传递机制,用于组件之间数据交换和发送广播消息。
实例
实现组件通信
一个主Activity和一个子Activity(Sub-Activity),使用主Activity上的按钮启动子Activity,并将子Activity的一些信息返回给主Activity,并显示在主Activity上。
主Activity界面上有一个“登录”按钮和一个用了显示信息的TextView,点击“登录”按钮后打开一个新的Activity,新Activity上面有输入用户名的控件,在用户关闭这个Activity后,将用户输入的用户名到主Activity,并显示在主Activity的TextView中
结果如下
MainActivity.java
package com.example.example4;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final int SUBACTIVITY = 1;//requestCode
TextView name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (TextView)findViewById(R.id.name);
final Button but = (Button)findViewById(R.id.login);
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SubActivity.class);
//startActivity(intent);不能进行信息交互
startActivityForResult(intent,SUBACTIVITY);//sub-activity启动
}
});
}
//处理子Activity返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SUBACTIVITY){
if(resultCode == RESULT_OK){
Uri uridata = data.getData();//获取返回值
name.setText(uridata.toString());//设置用户名
}
}
}
}
SubActivity.java
package com.example.example4;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
final EditText input = (EditText)findViewById(R.id.input);
Button but = (Button)findViewById(R.id.retun);
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String uriString = input.getText().toString();
Uri data = Uri.parse(uriString);//数据形式是Uri
Intent result = new Intent(null,data);//返回值封装在intent中
setResult(RESULT_OK,result);//设定需要返回给父Activity的数据
finish();
}
});
}
}
总结
启动Activity可以直接通过startActivity(Intent)方法启动,启动后的两个Activity之间相互独立,没有任何关联。
主要的启动方式是Sub-Activity方式启动,需调用startActivityForResult(Intent,RequestCode)函数。父Activity若要获得返回值,需重载onActivityResult()函数。
子Activity调用finish()函数关闭前,需调用setResult()函数设定返回给父Activity的数据,数据主要是以Uri形式返回给父Activity.