Activity 简述

Activity 简述

  Android 开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。

1 Activity简述

一个Activity通常展现为一个可视化的用户界面。主要用于和用户进行交互的,一个应用程序中可以包含零个或多个活动。Activity 中所有操作都与用户密切相关。一个activity可能展现为一个用户能够选择的菜单项列表或者展现一些图片以及图 片的标题。一个消息服务应用程序可能包括一个显示联系人列表的activity,一个编写信息的activity,以及其他一些查看信息和改动应用程序设 置的activity。尽管这些activity一起工作,共同组成了一个应用程序,但每个activity都是相对独立的。每个activity都 是Activity(android.app.Activity)的子类。

一个应用程序可能仅仅包括一个activity,或者像上面提到的消息服务程序一样有多个activity。一个应用程序包括几个activity以 及各个activity完毕什么样的功能全然取决于应用程序以及它的设计。通常每一个应用程序都包括一个在应用程序启动后第一个展现给用户的 activity。在当前展现给用户的activity中启动一个新的activity,能够实现从一个activity转换到另外一个 activity。

每一个activity都会有一个用于绘制用户界面的窗体。通常这样一个窗体会填充整个屏幕,当然这个窗体也能够比屏幕小并漂浮在其它窗体之上。 activity还能够使用一些额外的窗体,比如一个要求用户响应的弹出式对话框,或者是当用户在屏幕上选择一个条目后向用户展现一些重要信息的窗体。

定义:Activity是Android的四大组件之一。是用户操作的可视化界面;它为用户提供了一个完成操作指令的窗口。当我们创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在Android App中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。

一个Activity通常就是一个单独的屏幕(窗口)。

Activity之间通过Intent进行通信。

android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。在android stdio会自动生成,但eclipse需要自己手动添加

2 创建Activity

2.1 Activity的创建

新建一个Android 工程,在src 目录下新建一个类,不妨起名MainActivity,让该类继承Android SDK提供的Activity。

在MyActivity中覆盖onCreate()方法。onCreate() 方法是在当前Activity 被系统创建的时候调用的, 在该方法中一般要通过setContentView(R.layout.myactivity)方法给当前Activity 绑定布局文件或视图。因此为了让我们的MyActivity能够展示界面需要在工程目录的res/layout/目录下创建一个布局文件。比如我创建的布局文件名(注意:Android的资源文件名中是不允许有大写字母的,必须全小写,如果有多个单词可以用下划线分开)为myactivity.xml

<?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:orientation="vertical" >

<TextView

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:text="这是MyActivityA"/>

</LinearLayout>

   必须要注意的就是在该方法中必须先调用父类的onCreate() 方法, 也就是super.onCreate(savedInstanceState);该句代码必须被调用一次。这是为什么呢?我们看看父类的onCreate()方法里面都干了些啥就知道了。在父类的方法中执行了一堆业务逻辑,而且在最后一行用了一个成员变量mCalled 记录了当前方法是否被调用了。虽然我们现在还不看不同这些代码,但是我们已经知道既然父类帮我们实现了这么功能,那么我们子类就一定必须调用一次父类的该方法。

package com.xiaoluo.android_multiactivity;

import android.app.Activity;

import android.os.Bundle;

public class SecondActivity extends Activity

{

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.second);

    }

}

在AndroidManifest.xml 中进行Activity 的注册。

   Android 中共有四大组件,除了BroadCastReceiver 之外,其他三个组件如果要使用那么必须在AndroidManifest.xml 中进行注册(也叫声明)。我们在上面创建的MyActivity 如何注册呢?其实如果你不会的话完全可以将eclipse 自动生成的MainActivity 的注册代码给拷贝过来,然后将android:name 的属性值修改成我们的类。

<activity

    android:name="com.itheima.android.activity.MyActivity"

    android:label="@string/app_name" >

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

</activity>

2.2 Activity的跳转

一个Android 应用通常有多个界面,也就说有多个Activity,那么如何从一个Activity 跳转到另外一个Activity 呢?以及跳转的时候如何携带数据呢?Activity 之间的跳转分为2 种:显示跳转和隐式跳转。

Activity 之间的跳转都是通过Intent 进行的。Intent 即意图,不仅用于描述一个的Activity 信息,同时也是一个数据的载体

2.2.1 Activity显示跳转

在可以引用到另外一个Activity 的字节码,或者包名和类名的时候,通过字节码,或者包名+类名的方法实现的跳转叫做显示跳转。显示跳转多用于自己工程内部多个Activity 之间的跳转,因为在 自己工程内部可以很方便地获取到另外一个Activity 的字节码。

为了方便演示,我们创建一个新的Android 工程《Activity 的跳转》。然后创建两个Activity 类,分别为FirstActivity,和SecondActivity,并在Android 工程的清单文件中声明这两个Activity 类。工程清单中添加Activity 配置如下所示。

<activity

    android:name="com.itheima.activitySkip.FirstActivity"

    android:label="@string/app_name" >

    <intent-filter>

        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />

    </intent-filter>

</activity>

<activity android:name="com.itheima.activitySkip.SecondActivity"/>

   在上面的清单文件中,我们将FirstActivity 配置成了主Activity,SecondActivity 则为普通Activity。这样FirstActivity 就是我们应用的入口Activity 了。FirstActivity 和SecondActivity 代码清单如下所示。

package com.itheima.activitySkip;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

public class FirstActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_first);

    }

//绑定界面的Button 控件的点击事件,点击后实现跳转到SecondActivity

public void skip2Second(View view){

    //创建一个Intent 对象,并传递当前对象(Context 对象)和要跳转的Activity 类字节码

    Intent intent = new Intent(this, SecondActivity.class);

    //Intent 同时也是数据的载体,在跳转的时候可以携带数据

    //通过intent 的putExtra(key,value)方法可以设置数据

    //Intent 支持所有基本数据类型及其数组形式

    intent.putExtra("name", "张三");

    //启动第二个Activity

    startActivity(intent);

    }

}

public class SecondActivity extends Activity {

    protected void onCreate(android.os.Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_second);

        /**

        * 获取Intent 对象,该对象是启动了当前Activity 的对象

        */

        Intent intent = getIntent();

        if (intent != null) {

            // 从Intent 中获取设置的数据,如果获取不到返回null

            //获取FirstActivity 中设置的数据

            String name = intent.getStringExtra("name");

            if (name!=null) {

                Toast.makeText(this, "name="+name, Toast.LENGTH_LONG).show();

            }

        }

    };

}

显示跳转用法总结

显示Intent 的写法,通过Intent的带参构造函数

Intent intent = new Intent(this, ThirdActivity.class);

通过Intent 的setClass 方法

intent.setClass(this, SecondActivity.class);

Intent 可以携带的数据类型

八种基本数据类型boolean、byte、char、short、int、float、double、long 和String 以及这9 种数据类型的数组形式

实现了Serializable 接口的对象

实现了Android 的Parcelable 接口的对象以及其数组对象

2.2.2 Activity隐式跳转

隐式跳转不需要引用到另外一个Activity 的字节码,或者包名+类名,只需要知道另外一个Activity 在AndroidManifest.xml 中配置的intent-filter 中的action 和category 即可。言外之意,如果你想让

你的Activity 可以被隐式意图的形式启动起来,那么就必须为该Activity 配置intent-filter。

拨打电话的功能,其实那个实现的就是通过隐式意图跳转的功能。如果想让我们的SecondActivity 支持被隐式意图启动,那么就需要给SecondActivity 配置意图过滤器(intent-filter)。

1、配置intent-filter,SecondActivity 配置intent-filter

<activity android:name="com.itheima.activitySkip.SecondActivity">

    <!-- 配置意图过滤器-->

    <intent-filter >

        <!-- 在意图过滤器中设置action 和category,当有匹配的action 和category 的时候启动

        该Activity。这里使用Android 提供的默认category 即可-->

        <action android:name="com.itheima.activitySkip.SecondActivity"/>

        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>

</activity>

我们给SecondActivity 配置了intent-filter,该标签下的action 子标签是我们自定义的,而category 则必须使用系统提供的。通过我们使用android:name=”android.intent.category.DEFAULT”。配置成这样的category 的好处就是在启动SecondActivity 的时候category 可以设置也可以不设置。

2、通过隐式意图启动SecondActivity

使用隐式意图启动SecondActivity 核心代码

//创建一个Intent 对象

Intent intent = new Intent();

//设置Action,次Action 必须和intent-filter 中的action 一模一样

intent.setAction("com.itheima.activitySkip.SecondActivity");

//对于android.intent.category.DEFAULT 类型的信息为Android 系统默认的信息,省略也可以

intent.addCategory("android.intent.category.DEFAULT");

//启动Activity

startActivity(intent);

3 Activity生命周期

在Android中会维持一个Activity Stack(Activity栈),当一个新的Activity创建时,它就会放到栈顶,这个Activity就处于运行状态。当再有一个新的Activity被创建后,会重新压人栈顶,而之前的Activity则会在这个新的Activity底下,就像枪梭压入子弹一样。而且之前的Activity就会进入后台。

一个Activity实质上有四种状态:

a.运行中(Running/Active):这时Activity位于栈顶,是可见的,并且可以用户交互。

b.暂停(Paused):当Activity失去焦点,不能跟用户交互了,但依然可见,就处于暂停状态。当一个新的非全屏的Activity或者一个透明的Activity放置在栈顶,Activity就处于暂停状态;这个时候Activity的各种数据还被保持着;只有在系统内存在极低的状态下,系统才会自动的去销毁Activity。

c.停止(Stoped):当一个Activity被另一个Activity完全覆盖,或者点击HOME键退入了后台,这时候Activity处于停止状态。这里有些是跟暂停状态相似的:这个时候Activity的各种数据还被保持着;当系统的别的地方需要用到内容时,系统会自动的去销毁Activity。

d.销毁(Detroyed):当我们点击返回键或者系统在内存不够用的情况下就会把Activity从栈里移除销毁,被系统回收,这时候,Activity处于销毁状态。

活动状态

1、运行状态

当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。

2、暂停状态

当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。你可能会觉得既然活动已经不在栈顶了,还怎么会可见呢?这是因为并不是每一个活动都会占满整个屏幕,比如对话框形式的活动只会占用屏幕中间的部分区域。处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响,)只有在内存极低的情况下,系统才会去考虑回收这种活动。

3、停止状态

当一个活动不再处于栈顶位置,并且完全不可见的状态,就进入了停止状态。系统仍然会为这种活动保持相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。

4、销毁状态 当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。

  Activity 已经不能再简单的认为就是一个普通的类,其生命周期就是类的加载,对象的的创建和对象的卸载那么简单。Activity 从创建到销毁,整个生命周期是一个非常复杂的过程,该过程由Android 系统负责维护。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容