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

来源:互联网 发布:墨子号成功发射 知乎 编辑:程序博客网 时间:2024/06/12 01:36

在使用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


0 0
原创粉丝点击