Android学习笔记——Activity之显式启动第二个Activity

在使用Android应用程序过程中,我们经常会从一个“页面”转跳到另一个“页面”,这其中有些就是使用Activity的转跳来实现。而我们学习Android的过程中,启动另一个Activity也算是比较基础的内容。启动的方式有显式启动和隐式启动,其中显式启动的方法比较简单,本次就来讲讲显式启动另一个Activity的方法。

首先在res>layout>activity_main中,编辑如下的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    >
    
    
    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <Button
        android:id="@+id/start_second_activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动第二个Activity"/>
    
    <Button
        android:id="@+id/send_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送数据给第二个Activity"/>

</LinearLayout>

在如上的代码中,我们使用了LinearLayout来当父View,其中的orientation属性为"vertical",即子组件的排列方式是竖直方向。gravity属性为"center",即子组件将会是居中排布。然后从上到下依次是一个EditText和两个Button,可以将EditText的数据传给第二个Activity。第一个Activity界面如下:




对于一个界面的按钮,我们使用了两种方法来设置点击监听,Java代码如下:

    mStartButton = (Button) findViewById(R.id.start_second_activity);
    mSendButton = (Button) findViewById(R.id.send_text);

     mStartButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
第一个按钮,这个是启动另一个Activity的简单代码,只需要创建一个Intent实例,这里我们用到了Intent(Context packageContext, Class<?> cls)这个构造方法,第一个参数是目前所在的MainActivity,要注意这里的“MainActivity.”不能省略,应为这里是在一个匿名内部类中,如果省略了“MainActivity.”,那么“this”就会表示成当前的内部类。接着我们通过调用startActivity(Intent intent)方法来启动另一个Activity。

这种方法应该算是最简单的显式启动一个Activity(如果读者有其他更简单的方法,也可在评论告知,谢谢)但是并不能携带任何信息给启动的Activity。

    mSendButton.setOnClickListener(this);

    @Override
    public void onClick(View v) {
        Intent message = new Intent(this, SecondActivity.class);
        message.putExtra(EXTRA_MESSAGE, mEditText.getText().toString());
        startActivityForResult(message, REQUEST_CODE);
    }
第二个按钮,设置监听的参数使用了“this”,然后使MainActivity去实现View.OnClickListener这个接口,再重写onClick方法即可。在第二个按钮的点击事件中,我们使用Intent的putExtra(...)方法,将上面的EditText中的文本信息加入到message中。此处放进去的相当于是一个键值对,在第二个Activity中取出文本内容也是通过此处的键去取到值。要注意的点是此处调用的方法是startActivityForResult(intent,requestCode),使用此方法还可以接收要启动的Activity回传的数据。即可以实现两个Activity的通信。第一个参数是携带了文本信息的intent,第二个参数是一个请求码,设置好请求码可以实现第二个Activity回传数据给第一个Activity。

相信仔细思考的你可能会有疑问?传输的信息主要是附加在intent上的,那么我通过intent.putExtra(...),附加了信息,然后调用startActivity(intent)方法,不是也可以传输数据过去吗?答案是确定的,笔者认为可以这样来区分,startActivity方法只能实现单方面的数据传输,即从第一个Activity传数据到第二个Activity。而startActivityForResult方法则可以真正实现双方的数据传输。




在第二个Activity中如何接收到第一个传过来的数据呢?代码如下:

    getIntent().getStringExtra(MainActivity.EXTRA_MESSAGE)
通过getIntent()方法得到传送过来的intent(我们的数据就附加在intent上),再通过getXXXExtra(...)方法,参数就是之前键值对的key。这样就可以取出第一个Activity传输到第二个Activity的内容了。

如何实现数据的回传呢?在第二个Activity中,我们通过调用setResult(resultCode,intent)来返回数据。其中的resultCode,一般是
RESULT_OK,RESULT_CANCEL这两个常用的。这里我是通过Button的点击时间来实现回传,代码如下:

    mButton.setOnClickListener(new MyOnClickListener());
     
    private class MyOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.putExtra(EXTRA_CHECKED, mCheckBox.isChecked());
            setResult(RESULT_OK, intent);
            finish();
        }
    }
回传的信息同样是附加在intent中。(intent在Android中常做信息传输的载体)


在第一个Activity中,覆写onActivityResult()方法来处理。代码如下:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_CODE) {
                Boolean check = data.getBooleanExtra(SecondActivity.EXTRA_CHECKED, false);
                Toast.makeText(this, "SecondActivity:" + check, Toast.LENGTH_SHORT).show();
            }
        }

    }
首先通过回传是否OK来决定是否处理,再根据请求码来区分是哪一个Activity回传的数据(一个Activity可以通过设置不同的请求码来实现启动多个Activity,那么在回传数据的时候,就要判断是哪个Activity回传的数据)。这里和前面的intent取数据就是一样的了。取出数据之后,可以做相应的处理。


笔者也是学Android的新手,也是刚刚开始写blog,如果有什么写的不对的地方,欢迎各位指正。如果有什么问题的,也欢迎在评论区讨论,谢谢。下一篇打算讲讲Activity的隐式启动。

关于这个启动,可以看google的官方的介绍,同样是显式启动:https://developer.android.com/training/basics/firstapp/starting-activity.html


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值