Activity定义

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。
Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
一个应用程序通常由多个activities组成,他们通常是松耦合关系。通常,一个应用程序中的activity被指定为”main”activity,当第一次启动应用程序的时候呈现给用户的那个activity。每一个activity然后可以启动另一个activity为了完成不同的动作。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。
当一个activity因新的activity启动而停止,它被通知这种状态转变通过activity的生命周期回调函数。有许多回调函数一个activity可能会收到,源于它自己的状态变化-无论系统创建它、停止它、恢复它、摧毁它-并且每个回调提供你完成适合这个状态的指定工作的机会。例如,当停止的时候,你的activity应该释放任何大的对象,例如网络数据库连接。当activity恢复,你可以重新获得必要的资源和恢复被中断的动作。这些状态转换都是activity的生命周期的部分。

Activity四种基本状态

Active/Running
一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。
Paused
当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
Stoped
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
Killed
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。

Activity生命周期


  

public class TestActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test);    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();    }    @Override    protected void onPause() {        // TODO Auto-generated method stub        super.onPause();    }    @Override    protected void onRestart() {        // TODO Auto-generated method stub        super.onRestart();    }    @Override    protected void onResume() {        // TODO Auto-generated method stub        super.onResume();    }    @Override    protected void onStart() {        // TODO Auto-generated method stub        super.onStart();    }    @Override    protected void onStop() {        // TODO Auto-generated method stub        super.onStop();    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.test, menu);        return true;    }}

其中:
onCreate:在这里创建界面,做一些数据的初始化工作。最重要是在里面调用setContentView,还可以在里面初始化各控件、设置监听、并初始化一些全局的变量。
因为在Activity的一次生命周期中,onCreate方法只会执行一次。在Paused和Stopped状态下恢复或重启的下,这些控件、监听和全局变量也不会丢失。即便是内存不足,被回收了,再次Recreate的话,又是一次新的生命周期的开始,又会执行onCreate方法。;

onStart: 到这一步变成“用户可见不可交互”的状态。从Stopped状态重启之后, onStart和onRestart方法都会被执行,所以我们要判断哪些操作分别要放在哪个方法里面 。因为可能在onStop方法里面释放了一些资源,那么我们必须要重启他们,这个时候这些重启的操作放在onStart方法里面就比较好(因为onCreate之后也需要开启这些资源)。那些因为Stopped之后引发的需要单独操作的代码,就可以放在onRestart里面。

onResume:变成和用户可交互的,(在Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行完弹出栈,则回到上一个Activity);

onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来。onPause在onStop之前执行,onPause适合做一些轻量级的操作,更多的耗时耗资源的操作还是要放在onStop里面,比如说对数据保存,需要用到的数据库操作。

onStop:变得不可见 ,被下一个activity覆盖了。Activity进入到Stopped状态之后,它极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory方法,所以我们需要在onStop方法中尽可能的释放那些用户暂时不需要使用的资源,防止内存泄露。

onDestroy:这是Activity被kill前最后一个被调用方法了,可能是其他类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它是否还已经被回收Kill掉。  

Activity栈

Activity的栈的介绍,关系到设计人员如何使用和管理应用程序的整体所有的Activity。Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。Activity 的状态与它在栈中的位置关系如下图所示:
 

除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

Activity之间的通信

多个Activity之间进行通信是依靠Intent。不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中。通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,配合上Bundle对象将需要传递的数据通过Bundle打包后由Intent统一传递到目的地Activity。
下面看一个很简单的跳转代码块:

Intent intent = new Intent(TaskItemActivity.this, RadioActivity.class);Bundle bundle = new Bundle();bundle.putParcelableArrayList("soundList", soundlist);intent.putExtras(bundle);startActivity(intent);

该代码块实现了从TaskItemActivity跳转到RadioActivity,并且采用Bundle对象封装了一组数据传输到目的地Activity。接着在目的地Activity中,只需要执行以下代码即可获取到Bundle中的数据:

Bundle bundle = getIntent().getExtras();//得到传过来的bundle ArrayList data = bundle.getParcelableArrayList("soundList");//读出数据 

Activity 的 Intent Filter

Intent Filter 描述了一个组件愿意接收什么样的 Intent 对象,Android 将其抽象为 android.content.IntentFilter 类。在 Android 的 AndroidManifest.xml 配置文件中可以通过 节点为一个 Activity 指定其 Intent Filter,以便告诉系统该 Activity 可以响应什么类型的 Intent。
当使用 startActivity(intent) 来启动另外一个 Activity 时,如果直接指定 intent 对象的 Component 属性,那么 Activity Manager 将试图启动其 Component 属性指定的 Activity。否则 Android 将通过 Intent 的其它属性从安装在系统中的所有 Activity 中查找与之最匹配的一个启动,如果没有找到合适的 Activity,应用程序会得到一个系统抛出的异常。这个匹配的过程如下:

Activity的四种加载模式

在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
在android里,有4种activity的启动模式,分别为:
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode属性。

<activity  android:name="ActivityOne" android:label="@string/app_name" android:launchMode="standard"></activity>

相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。

Intent intent = new Intent(TaskItemActivity.this, RadioActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); 

Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。
其中:
代码中标志位:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP

mainfest中属性名控制启动模式有:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch

参考
版权申明:参考部分的内容版权归原作者所有,感谢原作者的共享
http://www.cnblogs.com/lyp3314/archive/2011/11/10/2244971.html
http://baike.baidu.com/link?url=g0ePdAZkwq5VhsVqeHMp577TRVTdnD1HuIjDMBO0QaJlcZIzLgaIBsgupysTr9kAMVrbtowSinBgzhCEA6aZh5P1Lq_LmqYH8I_4aq4fSKy
http://blog.csdn.net/ghj1976/article/details/6371356
http://www.cnblogs.com/renqingping/archive/2012/11/06/launchMode.html

更多相关文章

  1. 布局demo二:shape的使用
  2. 基于ubuntu16.04多用户编译android N(android 7.1)系统提示ninja
  3. android图书管理系统+javaweb后台服务器代码
  4. Android(安卓)蓝牙开发实例解析
  5. UBI文件系统
  6. Android(安卓)Notification使用系统通知栏布局出现的图标问题
  7. Android(安卓)4.4 Kitkat Phone工作流程浅析(九)__状态通知流程
  8. Android(安卓)NFS 文件系统
  9. Android(安卓)dumpsys命令学习小记

随机推荐

  1. android全屏显示
  2. Android(安卓)SDK Manager不能显示所有包
  3. 【Android】五种不同的Toast
  4. android的listView中设置line
  5. android 设置 dialog位置
  6. Android(安卓)代码实现关机重启
  7. Android清理后台所有历史App任务
  8. Android-BLE低功耗蓝牙开发
  9. android上tcpdump 抓包
  10. Android拍照、录像、录音代码范例