概述

Activities 是一个程序的组件之一。它的主要功能是提供界面。

一个程序一般由多个Activity组成,各activities之间关系很松散,它们之间没有直接的关联。必须有一个activity被指定为主activity,它是程序启动时首先显示的界面。每个activity都可以随意启动其它的activity。每当一个activity被启动,则前一个activity就被停止。一个程序中的所有启动的activity都被放在一个栈中,所以被停止的activity并没有销毁,而在存于棧中。新启动的activity先被存放于栈中,然后获得输入焦点。在当前活动的activity上点返回键,它被从棧中取出,然后销毁,然后上一个activity被恢复。

当一个activity因为新的activity启动而被停止时,它会收到状态变化的通知,这样的变化有多个,每个都会引起系统调用一个相应的回调方法以通知activity,这些回调方法被统称为“生命周期回调方法”。这些回调方法分别在Activity被创建、停止、恢复、销毁时被调用。

如何创建Activity

1 从类activity继承。

2 实现“生命周期回调方法”

两个最重要的方法是:

onCreate()--这个是必须实现的函数,在其中做初始化工作。记住:你必须在此函数中调用setContentView()函数的设置Activity的界面。

onPause()--这个虽然很重要,但不是要必须实现的。此函数在用户离开Activity时被调用(这一般并不表示Activity要被销毁了)。在这个函数中,你一般需要提交那些需保存状态的数据(因为用户可能不再返回到这个Activity)。

其它回调方法视情况实现。

实现用户界面

此处的用户界面指的就是activity上的控件们。所有的控件都从View类派生,所以可以把它们都称为View。每个控件占据一个矩形区域。

控件又分为以下两类:Widgets是完成特定功能的控件,比如button,text field,checkbox 等。Layouts是容纳Widgets控件并进行排版的控件,当然,Layout中还可以容纳Layout。Widgets从View类派生,Layouts从ViewGroup类中派生,开发者可以从View或ViewGroup派生创造自己的控件。

定义界面的最好的方法是使用XML格式的layout文件,它作为资源保存在工程中,可以在工程的res/layout下面找到这些XML文件。通过这种方式就做到了代码与界分离。把layout 下的某个XML设置为某个Activity的界面,需调用Activity的setContentView(),把XML的资源ID作为参数传入即可。

在名单文件中声明activity

为了能让系统操作你的Activity,你必须在工程的名单文件中声明它。例如:

<manifest ... >

<application ... >

<activity android:name=".ExampleActivity" />

...

</application ... >

...

</manifest >

当然有很多属性可以设置给Activity,比如label,icon或主题等等。详情请查看<activity>元素的说明。

注意看<activity android:name=".ExampleActivity"/>,看到activity name的值中,最前面有个”.”,如果你把它忘了,程序运行就会出错,而你很难找出错误的原因。其次,不论你是Activity是只内部使用还是外部使用,都要去名单文件中注册,否则依然会出现莫名其妙的错误,只是在内部使用时,不需要为acitivity增加意图过滤器。

使用intent过虑器

可以为一个<activity>元素指定多个过虑器。使用<intent-filter>元素指定。intent过虑器的目的是告诉其它组件如何启动这个Activity。当你使用ADT创建一个新工程时,根Activity被自动创建,它已具有两个意图过虑器,一个意图过虑器声明这个Activity负责响应“main”action;另一个过虑器声明这个Activity须被置于”launcher”类别之下。一般是这个样子:

<activityandroid:name=".ExampleActivity"android:icon="@drawable/app_icon">

<intent-filter>

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

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

</intent-filter>

</activity>

<intent-filter>中就是过滤器们。<action>说明此Acitivity是程序的”main”入口,<category>指出这个Acitivity需要在系统的应用列表中列出。

如果你写的程序中的Activity不需被其它程序调用,那么不需为这个Activity增加任何意图过滤器。但程序中必须有一个Activity被指定为”main” Action和”launcher” category。你自己程中的 Activity可以用更直接的方式调用。

然而,如果你想让你的Activity被其它程序调用,那么你需要为它增加意图过滤器。这些过意图滤器包括<action>,<category>以及<data>。这些元素指明了你的activity响应何种类型的intent。

启动一个Activity

你可以用startActivity()启动一个activity,它有一个参数是intent,你需要在这个intent中指明要调用的activity。Intent中你可以明确地指定要启动的activity,或只指定activity的类型,此时系统会为你挑选一个合适的activity,这个activity可能位于其它程序中,也可能位于你自己的程序中。Intent中可以带一坨被新activity使用的数据(相当于参数传递)。

在你的程序内部,如果需要启动一个内部的activity,你需在intent中明确指定新activity的类名。例如:

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

startActivity(intent);

SignInActivity是要启动的activity类。

然而,你的程序可能想执行自身没有提供的功能,比如发出邮件,发送短信息等。此时,需要启动其它程序提供的activity。此时就体现出intent的真正价值来了:它可以很容易地启动其它程序提供的activity,你只需要在intent中指定你要执行的动作,然后调用 startActivity() ,系统就会跟据你的需要,为你选择一个合适的activity,并启动它。如果同时有多个activity可以执行这动作,那么用户可以选择哪个被使用。例如,你想让用户发送一个电子邮件,你可以创建以下的Intent:

Intent intent = new Intent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);

startActivity(intent);

putExtra()是设置扩充数据的,.EXTRA_EMAIL表明第二个参数recipientArray里面放的是多个email地址。当发邮件的程序被启动并接收到这个intent时,它就把邮件地址们放到它的Acitivity界面的“to”控件中。当用户发送完毕返回时,你的activity就恢复运行(resume)。可以看到,启动另外一个程序是多么的容易。

启动一个acitvity并得到结果

有时,你可能想从你启动的activity获得其执行后返回的结果。此时你可以用方法startActivityForResult()来启动新acitivity(不再是startActivity了)。然后,你的程序还需要定义回调方法onActivityResult()。当新activity运行结束时,它把一个intent返回给你的程序,这个intent是在onActivityResult()中被接收。

例如:你想让用户打开通讯录,从中选择一个联系人,然后你取得用户所选的联系人,对之进行处理。以下是示例代码:

private void pickContact() {

//Create anintent to "pick" a contact, as defined by the content provider URI

Intent intent =new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);

startActivityForResult(intent, PICK_CONTACT_REQUEST);

}

@Override

protected void onActivityResult(int requestCode, intresultCode, Intent data) {

// If the requestwent well (OK) and the request was PICK_CONTACT_REQUEST

if (resultCode== Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {

// Perform aquery to the contact's content provider for the contact's name

Cursorcursor = getContentResolver().query(data.getData(),new String[]{Contacts.DISPLAY_NAME}, null, null, null);

if(cursor.moveToFirst()) { // True if the cursor is not empty

intcolumnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);

String name =cursor.getString(columnIndex);

// Dosomething with the selected contact's name...

}

}

}

此例子展示了在onActivityResult()中的基本逻辑流程。首选检查所启动的Activity是否正确运行,resultCode为Activity.RESULT_OK表示正常,其次,查看requestCode是否与当时请求的一致,即是否为PICK_CONTACT_REQUEST。都通过后,开始操作返回的数据,也就是data参数。

Data是这样处理的,用ContentResolver向内容提供者发出请求,这个请求会返回一个游标,通过这个游标读取数据,这很像数据库表的操作。要理解此处,请查阅Content Providers一节。

关闭Activity

Activity可以内部调用finish()方法关闭它自己,也可以调用finishActivity()方法关闭其它的activity。

注意:大多数情况下,你不应主动结束一个activity。系统掌管着activity的生命,所以你也不必结束自己的activity。使用上述方法会破坏用户体验。除非你觉得很必要时,否则就不要做!

转载于:https://www.cnblogs.com/phonegap/archive/2011/12/25/2535987.html

android activity详解一:概述相关推荐

  1. Android Activity详解

    创建一个Activity 创建一个activity至少需要三个文件: Java类 XML布局文件 应用的manifest文件 这三个文件关联密切,需要理解每个文件是干啥的.推荐大家使用Android ...

  2. android动画详解二 属性动画原理

    property动画是一个强大的框架,它几乎能使你动画任何东西.你可以定义一个动画来改变对象的任何属性,不论其是否被绘制于屏幕之上.一个属性动画在一定时间内多次改变一个属性(对象的一个字段)的值.要动 ...

  3. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  4. Android Preference详解之初识Preference及Preference系(一)

    Android Preference详解之初识Preference及Preference系(一) 转载:https://blog.csdn.net/google_huchun/article/deta ...

  5. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  6. Android菜单详解——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  7. Android LayoutInflater详解

    Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...

  8. android Fragments详解

    android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...

  9. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

最新文章

  1. 如何关注掘金的所有小伙伴
  2. 清理AD过期对象,并将结果发送给指定管理员
  3. PAT1047 编程团体赛 (20 分)
  4. [转]面试官,不要再问我三次握手和四次挥手
  5. mybatis注解开发_Spring Boot 中集成 MyBatis
  6. 视频解码芯片SAA7111A的初始化
  7. win8恢复我的计算机较早时间点,Win8系统的重置和刷新功能 -电脑资料
  8. string是python内置函数吗_Python 字符串与内置函数(方法)
  9. NUC1742 Subsequence【前缀和+二分搜索+尺取法】
  10. Eduline在线教育系统源码 带完整修复后台
  11. 在Word2007文档中创建数学公式——使用Word公式编辑器
  12. 迅雷上传速度怎么限制的方法
  13. 大学抢课到学校的计算机房,网络选课制度引发“抢课大战”
  14. POI读取word模板,根据list动态添加表格,按照字段填充
  15. c语言程序设计精髓第六章编程题
  16. English-旅游英语及情景对话
  17. 盘点那些欺骗我感情的数学定理
  18. (纯故事)我简单写几篇,就这一次
  19. 5G+金融科技:万物互联下的智慧金融
  20. 视频格式基础知识:让你了解MKV、MP4、H.265、码率、色深等

热门文章

  1. OpenCV人脸识别之二:模型训练
  2. 中如何调取api_【技巧】不去腾讯公司也能调取微信交易流水清单
  3. java中rtsp转m3u8_记录:通过ffmpeg rtsp转 http m3u8
  4. 如何通过大华sdk采集一帧图像?_EasyData解放数据标注员双手,采集清洗标注一站搞定...
  5. html 不显示null,如果model.entity为null,则不显示/写特定的html
  6. 51单片机按键计数器程序_51单片机是如何存储程序和数据的
  7. 万分之二用百分之怎么表示_红木家具怎么辨别真假
  8. charles的一些使用
  9. mysql知识点汇总
  10. JQuery中Ajax的Post提交中文乱码的解决方案