2.3 使用 Intent 在活动之间穿梭
2.3.1 使用显式 Intent
# app/src/main/res/layout/second_layout.xml
# app/src/main/java/com/example/activitytest/SecondActivity.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
}
}
# app/src/main/AndroidManifest.xml
#指定活动标题
#设为主活动
#设为启动器
#注册第二个活动
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实例化 Intent,第一个参数为当前上下文,第二个参数为要启动的目标活动
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// 启动目标活动
startActivity(intent);
}
});
}
2.3.2 使用隐式 Intent
# 指定当前活动相应的行为是 ACTION_START
# 指定当前活动相应的分类是 DEFAULT
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实例化 Intent,并设置行为是 ACTION_START,不设置分类则默认分类是 DEFAULT
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
}
增加活动分类:
# 指定当前活动相应的行为是 ACTION_START
# 指定当前活动相应的分类是 DEFAULT
# 指定当前活动相应的分类是 MY_CATEGORY
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实例化 Intent,并设置行为是 ACTION_START
Intent intent = new Intent("com.example.activitytest.ACTION_START");
// 为 Intent 设置分类是 MY_CATEGORY
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
}
2.3.3 更多隐式 Intent 的用法
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实例化 Intent,并设置行为是 ACTION_VIEW
Intent intent = new Intent(Intent.ACTION_VIEW);
// 设置 Intent 的 Uri
intent.setData(Uri.parse("https://www.baidu.com"));
// 启动活动,会打开系统浏览器访问设置的网址
startActivity(intent);
}
});
# 指定数据的协议部分是 http
调用系统拨号界面:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});
2.3.4 向下一个活动传递数据
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// 暂存数据到 Intent 中
intent.putExtra("extra_data", data);
startActivity(intent);
}
});
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
// 从 Intent 中取出数据
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
2.3.5 返回数据给上一个活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// 启动活动,并接受活动销毁时返回的数据,第二个参数为请求码,用于判断数据的来源
startActivityForResult(intent, 1);
}
});
}
// 下一个活动被销毁时的回调函数
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 判断数据来源
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity", "Task id is " + getTaskId());
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
// 暂存数据到 Intent 中
intent.putExtra("data_return", "Hello FirstActivity");
// 向上一个活动返回数据,第一个参数一般为 RESULT_OK
setResult(RESULT_OK, intent);
// 销毁当前活动
finish();
}
});
}
// 绑定按下返回键时的逻辑,与按钮点击的逻辑一致
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
}