【ALearning】第五章 Android有关组件介绍(一)Activity

【ALearning】第五章 Android相关组件介绍(一)Activity

       Android应用程序由一些零散的有联系的组件组成,通过一个工程manifest绑定在一起。在manifest中,描述了每一个组件以及组件的作用,其中有6个组件,它们是Android应用程序的基石。

  • Activities(活动)
  • Service(服务)
  • Content Provider(内容提供者)
  • Intent(意图)
  • Broadcast Receiver(广播接收器)
  • Notification(通知)
       在这里我们提到了组件(Component)的概念,组件(Component)是对数据和方法的简单封装,组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。谈及所谓架构和重用的时候,组件是难以回避的概念。在此我们再扩展一下,了解一下Android的面向组件思想。

【博客专栏:http://blog.csdn.net/column/details/alearning.html

【以下摘自CSDN博客:http://blog.csdn.net/luoxinwu123/article/details/8019547】

       面向组件思想是在软件规模扩大,复杂度上升的背景下,以面向对象为基础而提出的一种软件设计思想。可以把它理解为一种更粗粒度的面向对象,其粒度一般大于对象,但具体要到什么程度,又可以根据实际情况来决定。这种思想以组件为基础,强调“服务”的概念。 
       面向组件具有以下特点:
       低耦合性:组件之间一般互不依赖,一个组件只需要知道另一个组件的“名字”就可以访问它;
       高重用性:系统级的重用;
       高互操作性:不同的开发商开发出来的组件只要定义好了接口就可以互相访问;
       进程的透明性:组件可以工作在同一个进程也可以工作在不同的进程; 
       语言和开发环境的独立性:组件只需要定义好服务接口,内部实现可以采用任何语言。
       面向组件的框架已经有很多了,如JavaBean、EJB、COM等。Android系统并没有声称自己是面向组件的,但从其设计思想来看,Android一开始的设计考虑就是要采用一种“无边界”的设计方式,要实现系统内资源高度的重用。
事实上,Android完全符合面向组件的特征。首先,Android提供了Activity、Service、BroadcastReceiver和ContentProvider四大组件。这四大组件之间的协作是通过Binder机制和来协作的,其中ServiceManager与ActivityManagerService是保证组件间协同工作的最重要的基础,同时它们本身也是一种组件。ServiceManager是Binder的守护进程,用来管理各种服务,并向调用这些服务的客户提供查询远程接口的功能。而ActivityManagerService负责所有Activity和Service的启动,另外还负责系统中所有广播的注册和发布以及把广播发送给接收者。

本章将主要以案例的方式逐步介绍相关基本组件的概念、知识点与使用方式。接下来一起进行第一个基本组件Activity的学习。

Activity(活动)

首先我们需要明确对Activity(活动)的理解,Activity是用户与应用程序的交互的接口,即提供某个可视化的图文界面,同时是一组控件的容器,即我们可以把我们需要的控件添加在Activity活动界面中。
创建Activity需要继承android.app.Activity对象生成对应的子类。一般情况下,我们需要重写(覆盖)方法

protected void onCreate(Bundle savedInstanceState) 
较为深入的了解Activity,需要明白与说明Activity的生命周期。首先看看android developers 网上的activity的生命周期图,如下图所示:

【ALearning】第五章 Android有关组件介绍(一)Activity

在 Android 中,Activity 拥有四种基本状态:
1. Active/Runing:一个新的Activity入栈后,它在屏幕最前端,处于栈的最顶端,处于可见并且可交互的激活状态。
2. Paused:当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
3. Stoped:当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时的状态。
4. Killed:Activity 被系统杀死回收或者没有被启动时的状态。


Activtiy的生命周期涉及的方法:
protected void onCreate(Bundle savedInstanceState):一个 Activity 的实例被启动时调用的第一个方法。一般情况下,我们都覆盖该方法作为应用程序的一个入口点,在这里做一些初始化数据、设置用户界面等工作。大多数情况下,我们都要在这里从 xml 中加载设计好的用户界面。
protected void onStart():该方法在 onCreate() 方法之后被调用,或者在 Activity 从 Stop 状态转换为 Active 状态时被调用。
protected void onResume() :在 Activity 从 Pause 状态转换到 Active 状态时被调用。一般在这块做数据恢复工作。
protected void onPause(): 在 Activity 从Active状态转换到Pause 状态时被调用。一般我们在这里保存 Activity 的状态信息。
protected void onStop() :在 Activity 从 Active 状态转换到 Stop 状态时被调用。 
protected void onDestroy() :在 Active 被结束时调用,它是被结束时调用的最后一个方法,在这里一般做些释放资源,清理内存等工作。
protected void onRestart(): 在 Activity 从 Stop 状态转换为 Active 状态时被调用,不经常使用。
创建完Activity后,需要在AndroidMainifest.xml文件中注册已创建的Activity,本例的Activity为TestActivity。

<activity
            android:name="cn.mahaochen.app.alearning.chapter5.TestActivity"
            android:screenOrientation="portrait" >
</activity>

在此我们拓展一下知识与复习原来的知识点,关于AndroidMainifest.xml的属性配置。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mahaochen.activity"
    android:versionCode="1"
    android:versionName="1.0" >
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <!--
            .表示MainActivity是当前包com.mahaochen.activity下的类。如果类在应用的当前包下,可以省略点符号;如果类在应用的子包下必须加点,  
            如:MainActivity类在com.mahaochen.activity.user包下可以这样写:<activity  
            android:name=".user.MainActivity" />  
        -->
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <!--
                1、一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?  
               有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢?  
                android.intent.action.MAIN决定应用程序最先启动的Activity  
                android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里  
               2、因为你的程序可能有很多个activity只要xml配置文件中有这么一个intent-filter,而且里面有这个launcher,那么这个activity就是点击程序时最先运行的那个activity。  
                3、现在只有一个activity,那么加不加就没有关系了。用于模拟器启动时设置为默认打开为的activity。  
            -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="7" />
</manifest>

案例程序

【TestActivity.java】

import cn.mahaochen.app.alearning.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class TestActivity extends Activity{

	private final static String TAG = "MaHaochen_TestActivity";
	
	/**
	 * 通常情况下覆盖本方法,加载指定的ContentView资源布局
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_chapter5_activity);
		
		Log.e(TAG, "Activity_onCreate");
	}
	
	
	@Override
	protected void onStart() {
		super.onStart();
		
		Log.e(TAG, "Activity_onStart");
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		
		Log.e(TAG, "Activity_onResume");
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		Log.e(TAG, "Activity_onPause");
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		Log.e(TAG, "Activity_onStop");
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.e(TAG, "Activity_onDestroy");
	}
	
	@Override
	protected void onRestart() {
		super.onRestart();
		Log.e(TAG, "Activity_onRestart");
	}
}

【activity_chapter5_activity.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:gravity="center"
        android:text="Activity学习" />
	<ImageView android:src="@drawable/chapter5_activity_lifecycle"
	    android:layout_height="wrap_content"
	    android:layout_width="match_parent"/>

</LinearLayout>

效果截图

【ALearning】第五章 Android有关组件介绍(一)Activity

【ALearning】第五章 Android有关组件介绍(一)Activity

参考资料

1、 http://blog.csdn.net/bage1988320/article/details/6855774
2、 http://www.oschina.net/question/54100_27841
3、 http://blog.csdn.net/android_robot/article/details/6906243