使用Intent在活动之间穿梭
文章目录
前言
一个应用中总会存在多个活动,通过这些活动的相互跳转,数据传递,逻辑处理,便可完成一个应用的功能。在各个活动的跳转时,会通过Intent(意图),Intent使Activity跳转大致可分为显示意图和隐式意图.
一、显式Intent的使用
1.创建活动和布局
①创建两个活动FirstActivity和SecondActivity,都勾选Genarate Layout File选项但不勾选Launcher Activity选项。(如果有疑问或者不会创建活动的请参考前一课的文章)
②在FirstActivity的布局文件中定义按钮button1,在SecondActivity的布局文件中中定义按钮button2。
2.修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
3.代码解释
首先构建出了一个Intent,传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,这样我们的“意图”就非常明显了,即在FirstActivity这个活动的基础上打开SecondActivity这个活动。然后通过
startActivity()
方法来执行这个Intent。。这种传入启动活动和目标活动的方式称为显示Intent,不要忘记在AndroidManifest.xml文件中添加Activity声明。
二、隐式Intent的使用
相比较与显示,隐式Intent则含蓄了很多,它并没有明确指出我们想要启动哪个活动,而是通过指定一系列更为抽象的action和category等信息,然后由系统去分析这个Intent,并帮我们找到合适的活动去启动。
1.在活动的标签下配置< intent-filter>的内容
通过在标签下配置的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码:
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
2.修改FirstActivity中按钮的点击事件
修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
}
});
3.代码解释
①初始化Intent,为intent设置Action,添加Category,此时系统会自动帮助我们找到合适的需要启动的活动,系统如何找到呢,这就回到了刚才我们在配置文件中设置的
< intent-filter>
标签的中的action和category了,如果同时满足,则该活动就是系统为我们找到的将要启动的最合适的活动了。其实每个活动在配置文件中声明时,都会默认设置category参数,默认的值都为Intent.Category_Default,所以该属性的设置通常使用时都省略设置了。
②简单来说只有某个活动能够同时匹配< action>
和< category>
时,才可以通过Intent来启动它。
三、向下一个活动传递数据
当我们通过Intent在各个活动跳转时,避免不了需要传递数据,在向目标活动传递数据时,不管是通过显示还是隐式的方式传递时,系统提供了很多方便的Api供我们使用。
1.FirstActivity的代码:
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data","Hello SecondActivity");
// 这个是为了防止你觉得一个一个的传值很麻烦,可以传递一个bundle
Bundle bundle = new Bundle();
bundle.putString("bundle_string","sdsddfsf");
bundle.putInt("bundle_int",100);
intent.putExtra("bundle_data", bundle);
startActivity(intent);
}
});
2.SecondActivity的代码:
public class SecondActivity extends AppCompatActivity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
if (intent != null) {
if (intent.getStringExtra("extra_data") != null) {
String data = intent.getStringExtra("extra_data").toString();
Log.d(TAG, data);
}
Bundle bundle = intent.getBundleExtra("bundle_data");
if (bundle != null) {
if (bundle.get("bundle_string") != null && bundle.get("bundle_int") != null) {
String bundle_data = (String) bundle.get("bundle_string");
int intData = (int) bundle.get("bundle_int");
Log.d(TAG, bundle_data + "=" + intData);
}
}
}
3.代码说明
①在启动活动时传递数据的思路很简单,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。
②putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据。
③getIntent()方法获取到用于启动SecondActivity的Intent,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。
④在上一章的内容中我们用到了方法onSaveInstanceState()
,这个方法携带了一个Bundle参数,Bundle提供了一系列的方法用于保存数据。上面的代码中putString()
方法保护字符串,putInt()
方法保存整型数据。
⑤putExtra(“bundle_data”, bundle);中,bundle_data为键值对,第一个参数为键名,第二个参数为键对应的值。另一个活动的getBundleExtra("bundle_data")
取出了Intent对象中的这些值,参数为键名。
4.Logcat截图展示
四、返回数据给上一个活动
1.FirstActivity的代码:
findViewById(R.id.button_1).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, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
if (resultCode == RESULT_OK){
String return_data = data.getStringExtra("return_data");
if(return_data == null){
return;
}
Log.d(TAG, "返回的数据:"+return_data);
}
break;
default:
break;
}
}
2.SecondActivity的代码:
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("return_data", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
3.Logcat截图展示
总结
您的关注与点赞,是对我的最大支持!