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"?>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">            android:id="@+id/main_button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         android:text="按钮1"/>

    做好界面之后,就可以开始在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”测试数据//是一对键值对关系,类似JavaMapKey—Value键值对//本例即表示实际要传递的数据是字符串测试数据//而它所对应的key“name”
intent.putExtra( "name" , "测试数据" ) ; // 跳转界面startActivity(intent) ;

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

在SecondActivity中获取MainActivity传递的数据
//通过getIntent()取得上个界面传递过来的intentIntent intent = getIntent();//使用intentgetStringExtra(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”测试数据//是一对键值对关系,类似JavaMapKey—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的界面跳转和数据传递方式。


更多相关文章

  1. 2010-03-02 传智播客—Android(四)数据存储之五网络
  2. 22、从头学Android之Android的数据存储--SQLite
  3. android手机QQ界面设计
  4. Android入门篇五:使用全局变量在Activity之间传递数据
  5. Android内核开发:理解和掌握repo工具(含被墙后的下载方法)
  6. 第十二章:Android数据存储(下)
  7. webapp打包为Android的apk包的一种方法
  8. 学习Android之用户界面基础

随机推荐

  1. Android——界面布局
  2. Android异步消息机制
  3. Android(安卓)Studio 查看不到SDK源码解
  4. Android: Service中创建窗口Dialog
  5. android快速集成高德地图
  6. 2010-02-27 传智播客—Android(二)数据存储
  7. 从Android发展看Meego
  8. Android中要让一个程序的界面始终保持一
  9. Android(安卓)4.0 Launcher2源码分析——
  10. Android推送通知指南