Android应用程序由一些零散的有联系的组件组成,通过一个工程manifest绑定在一起。在manifest中,描述了每一个组件以及组件的作用,其中有6个组件,它们是Android应用程序的基石。
- Activities(活动)
- Service(服务)
- Content Provider(内容提供者)
- Intent(意图)
- Broadcast Receiver(广播接收器)
- Notification(通知)
【博客专栏: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的生命周期图,如下图所示:
在 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>
效果截图
参考资料
1、 http://blog.csdn.net/bage1988320/article/details/68557742、 http://www.oschina.net/question/54100_27841
3、 http://blog.csdn.net/android_robot/article/details/6906243