android 移动开发activity组件

Android App开发基础篇—四大组件之Activity简介

前言:前面介绍了Android App开发一些常用的布局和控件,这些布局和控件的使用很简单,对于刚开始接触Android的同学,只需要知道如何在布局文件中熟练使用即可。当然 ,在实际项目中,要做出和UI设计一样精美的界面,通常还需要一些自定义控件的技巧,这会在以后进行介绍。今天开始,我们将开始来认识一下Android开发中的重点知识,也可以说是Android的构成基石,即Android四大组件(Activity、Service、Broadcast、ContentProvider)。本篇,我们首先来介绍Android中的界面组件—Activity。

一、概念:

首先看一下官方文档对Activity的解释:

An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).

大致可以翻译为:

一个activity就是一个单独的,关注于用户所能做的事情的东西。几乎所有的activity都和用户操作相关,因此,Activity所关心的事情就是创建一个窗口,并通过setContentView(View)方法来加载你所有的UI元素。

通过上面的解释,我们可以理解为,Activity在Android应用中的表现就是一个页面,当我们需要一个新的页面时,就可以通过新建一个Activity来实现。每个Android应用都是由一个或者多个Activity组成的。

二、作用:

通过上面的概念我们知道了一个Activity就是一个页面单元,那么它的作用主要有哪些呢?这里我们来总结一下:

(1)作为页面组件,负责加载指定的布局文件(通过setContentView(View)方法)来显示各种UI元素,同时为页面上的UI元素设置事件处理函数(例如为某个Button设置按钮点击事件),使得用户能够与这些UI进行交互。

(2)实现页面之间的跳转。通常来说,一个应用都会有许多的页面(即由多个Activity组成),每个页面提供不同的功能和操作(如登录页面提供用户登录操作,首页实现信息显示功能等),因此,必然存在页面与页面之间的跳转。Android应用中,页面的跳转就是通过Activity来实现的,简单说就是,页面的跳转其实就是不同Activity之间显示或关闭的切换。下面来看一个简单的页面跳转的例子:

首先,需要先来认识一下Intent。在Android中,Activity、Service和Broadcast之间是通过Intent来传递消息的,界面的跳转也是通过Intent实现的。这里,我们先看一下Intent的基本用法,关于Intent以后再具体介绍。来看一下代码:

//实例化一个Intent对象Intent intent = new Intent();//设置界面跳转方向intent.setClass(MainActivity.this, SecondActivity.class);//跳转界面startActivity(intent);

知道了如何实现界面跳转的操作,接下来就可以来练习一下了。新建一个项目,在项目中新建两个Activity,一个叫MainActivity,一个叫SecondActivity。在两个Activity的布局文件中,分别添加一个Button。代码如下:

下面是MainActivity布局文件中的代码,代码很简单,就是在新建的布局文件中直接添加一个Button,然后设置一下Button的id属性即可。SecondActivity也是一样的操作,就不再贴出。其中为了避免混淆,两个界面中Button的id最好设置不一样。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="***/apk/res/android" xmlns:tools="***/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:cOntext="com.test.myapplication.MainActivity"> <Button android:id="@+id/main_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按钮1"/> </RelativeLayout> 

做好界面之后,就可以开始在Activity中来写代码实现界面的跳转了。两个界面的写法是相似的,只是在设置跳转方向的时候要注意参数的顺序。下面贴出MainActivity的代码,代码如下:

package com.test.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //为了在Activity中对布局文件中的UI元素(控件、布局等)进行操作,需要 //使用findViewById()方法从布局文件中找到对应的UI元素,并将其关联到 //Activity中的一个对象。代码书写格式如下: Button button = (Button) findViewById(R.id.main_button); //布局中的Button按钮设置点击事件监听 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //实例化一个Intent对象 Intent intent = new Intent(); //使用setClass(Context packageContext, Class<?> cls)方法设置界面跳转方向, //其中, 第一个参数表示当前界面的上下文对象,即XXX.this, //第二个参数表示要跳转的界面的类名,即XXX.class intent.setClass(MainActivity.this, SecondActivity.class); //跳转界面 startActivity(intent); } }); } } 

二、数据传递

学会了如何进行界面跳转,可是这还不够呢。实际开发中,经常需要在两个界面之间传递数据,那么应该怎么做呢?很简单,既然界面跳转是通过Intent来进行的,上面也提到Android中的Activity、Service、Broadcast之间是通过Intent传递消息的,那么,同样的,Activity之间的数据传递也可以通过Intent来实现,只需在跳转界面之前,使用Intent的putExtra()方法,将要传递的数据添加到Intent中即可。还记得上面界面跳转的代码吗?下面,我们在跳转代码的基础上再加上一条传递数据的代码,代码如下:

在MainActivity中设置要向SecondActivity传递的数据
//实例化一个Intent对象Intent intent = new Intent();//使用setClass(Context packageContext, Class<?> cls)方法设置界面跳转方向,//其中, 第一个参数表示当前界面的上下文对象,即XXX.this,//第二个参数表示要跳转的界面的类名,即XXX.classintent.setClass(MainActivity.this, SecondActivity.class);
//设置要传递的数据,参数 “name”和“测试数据” //是一对键值对关系,类似Java中Map的Key—Value键值对 //本例即表示实际要传递的数据是字符串 “测试数据”, //而它所对应的key是“name”

intent.putExtra("name","测试数据");//跳转界面startActivity(intent);

看到上面蓝色那句代码了吗?没错,就是这么一行简单的代码。Intent的putExtra()方法可以将要在两个界面之间传递的数据添加到intent中,然后在界面跳转的时候,将数据传递到目标界面。这个方法有很多的多态形式,可以让我们传递各种数据类型的数据。需要注意的是,这个方法有两个参数,这两个参数是一对键值对关系,就像Java中Map的Key—Value键值对一样。这是因为当我们在目标界面要获得数据时,需要根据putExtra()方法设置的key来获得。在目标界面获得数据的方法如下:

在SecondActivity中获取MainActivity传递的数据
//通过getIntent()取得上个界面传递过来的intentIntent intent = getIntent();//使用intent的getStringExtra(String name)方法,获得传递过来的数据//这里因为上个界面传递的是字符串类型的数据,所以使用getStringExtra()方法//如果传递的是int类型,则使用getIntExtra(),其他类型依次类推String value = intent.getStringExtra("name");

好了,现在我们学会了界面跳转和数据传递了。可是新的问题又出现了。上面所做的数据传递是单向的,就是从当前界面传递到目标界面,然后在目标界面接收以后就结束了。那如果我们需要双向传递数据呢?

仍以上面的例子举例,假设在SecondActivity接收到MainActivity传递的数据,并且在SecondActivity处理完毕后,需要把处理结果返回给MainActivity,那应该怎么办呢?当然我们可以用上面的方法再写一遍,可是我们会发现,好像有哪里不对(原因要涉及到Activity的启动模式,不明白也不急,后面会提到)。

下面我们就来看一下数据双向传递的做法。实际上,Android中Activity的跳转有两种方式,一种是不带返回结果的跳转,就是上面所介绍的startActivity(intent)方法;另一种则是带返回结果的跳转,就是可以从目标界面返回结果给起始界面的跳转,这种方法的具体操作如下,直接上代码:

在MainActivity中使用startActivityForResult()方法跳转到SecondActivity界面
//实例化一个Intent对象Intent intent = new Intent();//使用setClass(Context packageContext, Class<?> cls)方法设置界面跳转方向,//其中, 第一个参数表示当前界面的上下文对象,即XXX.this,//第二个参数表示要跳转的界面的类名,即XXX.classintent.setClass(MainActivity.this, SecondActivity.class);//设置要传递的数据,参数 “name”和“测试数据”//是一对键值对关系,类似Java中Map的Key—Value键值对//本例即表示实际要传递的数据是字符串 “测试数据”,//而它所对应的key是“name”intent.putExtra("name", "测试数据");//使用带返回结果的方法跳转界面startActivityForResult(intent,0);

注意红色那行代码,没错,就是把前面说的方法中的startActivity(intent);改成startActivityForResult(intent,0);只要改这个方法就行。来看一下startActivityForResult这个方法。首先看这个方法的原型startActivityForResult(Intent intent,int requestCode),可以看到这个方法有两个参数,第一个参数就是我们定义的Intent对象,第二个参数是一个int型的数值,从字面意思看叫做请求码。requestCode的作用在于:由于在一个Activity中,我们可能会在多个不同的方法中同时使用了startActivityForResult 跳转到同一个目标界面,而由于每个方法处理的业务情景不同,目标界面返回的数据也不同,此时,就需要通过requestCode来判别是调用了哪个方法跳转界面返回的结果。那么,从目标界面要怎么把返回数据返回给起始界面呢?来看一下代码:

在SecondActivity界面需要向MainActivity返回结果的地方
//实例化一个Intent对象Intent data = new Intent();//设置返回数据data.putExtra("结果","结果数据");//向起始界面返回消息setResult(1,data);//关闭自身finish();

如上所示,同样使用Intent进行消息的传递,所不同的是,在设置完数据后,这里直接调用setResult()方法。setResult方法由参数的不同,有两种形式。当有数据需要返回时,如上述一样,传入一个resultCode参数和一个Intent对象。否则,只需传入一个resultCode。resultCode的作用在于:有时候,在目标界面可能存在多个方法使用setResult来向同一个起始界面返回结果。此时,当我们在起始界面要接收返回的结果时,就需要通过resultCode来区分该结果是由目标界面的哪个方法所返回的,由此而根据情况处理对应的业务情景。接下来看一下如何在起始界面接收目标界面返回的结果,代码如下:

在MainActivity(起始界面)中,重写onActivityResult方法,在该方法中接收目标界面返回的结果。
//该方法用于接收通过startActivityForResult方法//跳转的目标界面返回的结果数据@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==0){ if (resultCode==1){ String result = data.getStringExtra("结果"); Log.e("result", "onActivityResult: result=-=======" +result ); } }}

至此,我们已经知道了如何实现界面跳转以及界面之间的数据传递方法。同学们可以结合前几篇介绍过的布局和控件,自行搭建几个界面来练习一下。

后记:关于Activity,还有Activity的生命周期、Activity的启动模式等内容,都是比较重要的内容,由于担心篇幅过长,读起来会感觉不便,因此决定将这些内容分篇介绍,本篇就暂时只介绍一下Activity的界面跳转和数据传递方式。

本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年4月22日 下午1:18
下一篇 2023年4月22日 下午1:43

相关推荐