现在的位置: 首页 > 综合 > 正文

android 学习教程五—- 四大组件之一Activity 详解

2013年10月14日 ⁄ 综合 ⁄ 共 4342字 ⁄ 字号 评论关闭

 

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

 

本章主要涉及一下知识点:

 一. Activity的生命周期及应用场景:
二 . 让Activity变成一个窗口:Activity属性设定
三 你后台的Activity被系统 回收怎么办:onSaveInstanceState

一 Activity的生命周期 :

  

  Android的应用程序 的生命周期是被统一掌控 的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,不能改变它,只能学习 并适应它。

   简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信 ,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 ,

    另 外系统也不允许你占用太多资源 ,至少要保证电话功能吧,所以资源不足的时候也就有可 能被干掉。

                                                               

                                                                                             activity生命周期图

 

 

四大状态:

一般来讲,某一时刻,Activity处在下面四个状态之一:

Active:当Activity运行在屏幕前台,此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动(Active)或运行。

Paused:当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所

               有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。

Stopped:完全被另一个Activity遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉,但是以                通 过 notification进行通信。

Dead:Activity 尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用"finish"方法。例如为了释放紧缺的内存空间。

 

状态转变的事件:

当状态改变时,Android会提供1个或者多个触发调用方法。我们通过重写这些方法来实现我们的处理。

public class MyActivity extends Activity{

     protected void onCreate(Bundle savedInstanceState){….. }

     protected void onStart(){….. }
     
     protected void onRestart(){….. }

     protected void onResume(){….. }

     protected void onPause(){….. }

     protected void onStop(){….. }

     protected void onDestroy(){….. }
}

     我们的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume,

 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,

但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断  这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume

 

 生命周期七种状态解析:

 

    onCreate(Bundle savedInstanceState) :通常用于初始化设置: 1、为Activity设置所要使用的布局文件2、为按钮绑定监听器等静态的设置操作

 onStart() :当Activity可见未获得用户焦点不能交互时系统会调用

 onRestart() : 当Activity已经停止然后重新被启动时系统会调用

 onResume(): 当Activity可见且获得用户焦点能交互时系统会调用

   onPause():  应该使用onPause()来存储持久数据。

                    当系统启动另外一个新的Activity时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据、停止动画等,这个实现方法必须非常快。当系统而不是用户自己出于回收内存时,关闭了activity 之后。用户会期望当他再次回到这个activity 的时候,它仍保持着上次离开时的样子。此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,在onPause()之前被触发,当系统为了节省内存销毁了Activity(用户本不想销毁)时就需要重写这个方法了,当此Activity再次被实例化时会通过onCreate(Bundle
savedInstanceState)将已经保存的临时状态数据传入因为onSaveInstanceState()方法不总是被调用,触发条件为(按下HOME键,按下电源按键关闭屏幕,横竖屏切换情况下),你应该仅重写onSaveInstanceState()来记录activity的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。

 onStop():当Activity被新的Activity完全覆盖不可见时被系统调用

onDestroy():当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等

 

生命周期场景例子:

   一下例子参用恺风 哥们的:

场景1:如果我们在一个activity(activity1)中通过intent启动另一个activity(activity2),那么触发的过程是:

activity1-onPause()->activity2-onCreate()->activity2-onStart()->activity2-onResume()->activity1-onStop()

activity1:失去了用户的焦点,无法和用户进行互动,被activity2覆盖,调用了onPause(),然后是activity2的启动调用过程,通常activity2不是覆盖部分,而且完全占据屏幕,由此activity1被隐藏,activity1进入了Stopped状态,调用activity1-onStop()。如果acvity2已对话框的方式,而不是全屏幕,即activity1不会并因此,仍然保留在Paused状态,则不会触发activity1-onStop()。

activity2:对于一个activity的启动顺序为初始化onCreate() -> 用户可视onStart() -> 用户可互动(获得焦点)onResume()

 

场景2:我们按菜单的返回键,从activity2退出,并恢复为activity1

activity2-onPause() -> activity1-onRestart() -> activity1-onStart() -> activity1-onResume() ->
activity2-onStop() -> activity2-onDestory()

activity1:在场景1中进入Stopped状态,重新恢复,进入onRestart()状态,UI可视onStart(),获得焦点用户可互动onResume()

activity2:按返回键,acivity将被注销,根据android给出来的图,依次进行onPause()失去焦点不可互动->onStop()不可视->on Destory()被关闭。

 

二 . 让Activity变成一个窗口:Activity属性设定

           简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义  :比如一个漂浮在手机主界面等

 

Xml代码

android :theme="@android:style/Theme.Dialog"

android:theme="@android:style/Theme.Dialog"

这就使你的应用程序变成对话框的形式弹出来了,或者

Xml代码

android:theme="@android:style/Theme.Translucent"

android:theme="@android:style/Theme.Translucent"

就变成半透明的,

上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog

 

三  .你后台的Activity被系统回收怎么办:onSaveInstanceState

   保存数据的方式为onSaveInstanceState(),要注意,由于activity会频繁地执行之,所以一定要保证高效,只将我们的data存放如Bundle。获取数据有两个途径,一是onCreate(Bundle)中的参数携带该data,二是在onRestoreInstanceState()。我们可以选择所需的数据,这个数据甚至可以是一个callback

当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B

这个时候A会执行

Java代码
public
void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState);  
    outState.putLong("id", 11111111111);  
}  

 

抱歉!评论已关闭.