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. 浅谈Java中Collections.sort对List排序的两种方法
  2. mybatisplus的坑 insert标签insert into select无参数问题的解决
  3. python起点网月票榜字体反爬案例
  4. Python list sort方法的具体使用
  5. python list.sort()根据多个关键字排序的方法实现
  6. android手机QQ界面设计
  7. android的消息处理机制(图+源码分析)——Looper,Handler,Message
  8. Android简单登录系统
  9. android BLE Peripheral 模拟 ibeacon 发出ble 广播

随机推荐

  1. Android TensorFlow 智能语音识别
  2. Android不用OnScrollListener采用Gesture
  3. Android中Market的Loading效果实现方法
  4. Android(安卓)ViewDragHelper及移动处理
  5. Android应用程序目录定义及使用方法
  6. android连接sql2008
  7. android 调色板小练习
  8. android中Manifest文件的语法层次
  9. #周末课堂# 赵扬老师 Android系列课程【L
  10. android转IOS开发学习计划