Android学习笔记8——用户界面之Activty

Acitivity就是用来响应用户操作界面的一种应用组件,它也是android的四大组件之一。每个activity都被系统给予一个用来显示用户界面的窗口,这个窗口一般是填充整个屏幕,也可能比屏幕要小,在其他窗口之上显示。

一个应用通常包含了多个相互关联的Activity,并且其中一个activity被叫做main,它是这个应用程序的入口,也就是我们第一次打开应用时所看到的。为了展示不同的动作,每个Activity都能启动另一个activity。而每一个新的Activity的启动都代表前一个Activity的停止,但是系统把这Activity保存在称为‘back stack’的回退栈中。一个新的Activity的开启,都会把这个activity压入到回退栈中,并且获取到用户焦点。这个回退栈按照‘先进后出’的原则,因此,当用户操作当前的activity时,这个activity被压入栈中,当用户按下回退按钮时它就会被弹出栈,前一个activity恢复正常。

当一个新的Activity启动的时候,另一个Activity就会停止,这个停止的Activity就会通过这个Activity的生命周期的回调方法通知这个状态的改变。由于状态的改变(无论这个系统创建、停止、恢复、销毁),一个Activity可能收到几种回调方法,每一个回调方法都会让你有机会在状态改变的时候做些特殊的工作。

那么如何创建一个Activity呢?

1、首先你需要创建一个继承Activity的类;

2、在这个类中你需要实现这个Activity的生命周期的不同的回调方法;其中onCreat方法是我们必须要进行实现的方法,我们通常在这个方法中初始化用户你的Activity的一些必需的参数,最重要的是我们调用setContentView方法来定义这个activity的界面。

启动一个Activity

我们可以通过调用startActivity这个方法,并且传递一个Intent参数来启动一个Activity,这个Intent要么精确的描述了你想要启动的Activity,要么大概的描述了你想要进行的动作(这样系统还会根据你所描述的动作选择一个比较精确的Activity为你,有时甚至是另一个App的Activity)。一个Intent能够携带一些被启动的Activtity的数据。

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);

如何启动一个返回结果的Activity?

有时候,我们想要从启动的Activity中返回一个结果,这个时候我们就需要调用startActivityForResult来启动这个Activity,而为了接收这个要启动的Activity返回的结果,我们需要在第一个Activity中实现onActivtyResult方法。当第二个Activiy完成后,它就会返回一个Intent结果传递到onActivtyResult方法中。

private void pickContact() {
    // Create an intent 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, int resultCode, Intent data) {
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        // Perform a query to the contact‘s content provider for the contact‘s name
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact‘s name...
        }
    }
}

如何保存Activty的状态?

正如前面我们提到的,当一个Activity停止或暂停的时候,这个Activity的状态仍然保持着,这是对的,因为当这个Activity被停止或者暂停的时候这个Object对象仍然在内存中,这也就是说这个Activity的所有成员和状态仍然保留着。因此,任何用户操作的状态变化仍然保存着,以至于当这个Activity返回到前台的时候,这些改变仍然在那里。

然而,如果这个系统为了内存销毁了一个Activity时,这个Activity对象被销毁了,因此这个系统不能仅仅简单的恢复过来。相反,这个系统肯定会重新创建这个Activtity对象,但是用户是不知道这些的,如此以来,用户可能希望,这个Acitvity恢复到原来的信息状态。在这种情况下,你能通过实现Activity的生命周期的回调方法中的onSaveInstance这个方法来保存用户重要的信息和状态。

系统会传递一个Bundle对象给这个方法,这个对象用putString和putInt方法保存着键值对。当系统杀死你的应用进程并且用户返回你的Activtiy时,系统就会重新创建这个Activity,并且传递这个Bundle给onCreate和onRestoreInstanceState方法,但是如果没有状态信息被保存,这个Bundle就会是一个NULL。

但是即使你不做任何事情,并且不实现onSaveInstanceState方法,这个Activity的状态仍然会调用onSaveInstanceState默认实现方法。在Android框架中几乎每一个组件在需要的时候都会默认实现这个方法保存可见的UI的状态信息,但是只能保存那些定义了id属性的组件,没有ID属性的组件,状态系统是无法保存的。而且只能是组件的属性值,对于其他和布局相关的值是不保存的,我们必须实现onSaveInstanceState方法来保存这些值。例如我们可以保存一个列表的所有数据。

时间: 2024-11-05 02:41:10

Android学习笔记8——用户界面之Activty的相关文章

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供.我们将相关信息存储在一个intent中,例如该文本的Uri.这个intent可以匹配系统的多个应用,替代菜单将这些应用一一列出,菜单项的title就是该可被调用的activity的名字,图标也为该可被调用的activity的图表. 小例子说明 我们通过一个小例子进行学习,简单地打开一个URL:we

Android学习笔记(二二): 多页显示-Tag的使用

在手机屏幕中,Tab也是比较常用的,通常和List结合,例如我们手机的通信录.下面是Tag的结构. TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout.TabWidget就是每个tab的标签,FrameLayout则是tab内容. 如果我们使用extends TabAcitivty,如同ListActivity,TabHost必须设置为@android:id/tabhost TabWidget必须设置android:id为@android:id/tabs F

Pro Android学习笔记(十二):了解Intent(下)

解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键就是component 名字,在<intent-fliter>中声明的其他属性被忽略.对于implicit intent,则根据action,category和data来进行匹配.然而一个intent fliter中可以声明多个actions,多个categories,多个data属性,因此可以满

Pro Android学习笔记(十):了解Intent(上)

Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent基本含义 intent是通知平台处理(唤起)的动作.Android唤起的动作将取决于注册了什么动作.例如我们有个简单的Activity:IntentBaiscViewActivity.在AndroidManife

Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)

前几日Android发布了4.0 Icecream,昨天上网发现Begining Book中有Edition 3的版本,比对一下,还是有相当的改动,不仅仅增加了tablet的部分,对原有的章节有有一些修订,前后的调整等等.先按Edtion 2的顺序看,相同章节的看Edtion 3,然后回头看Edition 3的Chapter 24.25(E2的36).26.27.28.29.44.45.46.47几个新增章节.同时将模拟器改为Android 2.3的版本,已适应可能新增的改动. 访问Intern

Android学习笔记(四一):SQLite的使用

SQLite是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite.SQLite提供SQL接口,和一般的数据库一样.但是Android的API不采用JDBC,JDBC消耗太多的资源. SQLite支持绝大部分SQL-92标准,不支持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOI

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记(四三):文件访问

之前我们学习了通过preference和SQLite数据库进行数据存储,也可以通过文件方式.文件可以是在应用打包时预置,也可以是应用所生成. 文件访问有两种方式:一:静态数据的文件可以防止在res/raw中,这些文件是只读的,只有在应用版本升级的时候进行修改,或者我们先读出这些数据,通过 reference的方式来处理,这样以后可以进行修订,但是这种方式,会有两份数据保存.二:另一种方式是通过URL访问文件,动态数据的读取也可以采用SQLite3的方式. res/raw/下静态文件的读取 在re