使用Intent在活动之间穿梭(Android学习笔记之第六课)

使用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截图展示


总结

在这里插入图片描述
您的关注与点赞,是对我的最大支持!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜小乌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值