一、使用Intent启动活动
Intent大致可以分为两种:显式Intent和隐式Intent
1. 显式Intent
button.setOnclickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
2. 隐式Intent
打开AndroidManifest文件,在activity标签下配置intent-filter标签的内容,指定当前活动能响应的action和category
<activity android:name=".secondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
只有action和category中的内容同时匹配上Intent中指定的action和category时,这个活动才能响应Intent
button.setOnclickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
二、使用Intent传递数据
1. 向下一个活动传递数据
button.setOnclickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
});
上面的代码中就实现了使用Intent向下一个活动传递数据,数据暂存在Intent中,启动另一个活动后,再把数据从Intent中取出来
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = Intent.getStringExtra("extra_data");
Log.d("SecondActivity ", data);
}
}
如果传递的是整型数据则用getIntExtra(),如果是布尔型数据则使用getBooleanExtra()
2. 向上一个活动传递数据
如果要实现下一个活动向上一个活动传递数据,则启动下一个活动时不再是使用startActivity()方法,而是使用startActivityForResult()来启动下一个活动
button.setOnclickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//第二个参数是请求码,只要是一个唯一值就行,后面会用到
startActivityForResult(intent, 1);
}
});
再来看看下一个活动是怎么返回数据的
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button btn = findViewById(R.id.btn);
btn .setOnclickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
//第一个参数是处理结果
setResult(RESULT_OK, intent);
finish();
}
});
}
}
因为我们使用的是startActivityForResult()方法来启动SecondActivity的,当SecondActivity被销毁后会回调上一个活动的onActivityResult()方法,所以我们需要重写这个方法来得到返回数据
//第一个参数就是请求码,第二个参数是处理结果,第三个参数是返回数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK) {
String returnData = data.getStringExtra("data_return");
Log.d("SecondActivity ", returnData );
}
break;
}
}
如果我们不是点击按钮返回,而是通过点击Back键返回的话怎么传递数据呢?答案是可以在SecondActivity中重写onBackPressed()方法来解决
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}