您的位置:首页 > 移动开发

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

2017-02-07 10:37 525 查看

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="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/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.class
intent.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()取得上个界面传递过来的intent
Intent 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.class
intent.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方法
//跳转的目标界面返回的结果数据
@Override
protected 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的界面跳转和数据传递方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: