- 浏览: 298310 次
- 性别:
- 来自: 上海
最新评论
-
再_见孙悟空:
写的不错
Dialog -
a549262189:
支持下,正好在学习这块的内容!
Android Gesture Detector -
dcsff:
受教了
LayoutInflater -
庆_啊:
真厉害。
LayoutInflater -
ghj234:
学习了,哈哈
LayoutInflater
Android中,Component(activity、service和broadcast receivers)的生命周期始于其响应一个Intent请求,终于该Component销毁。在这期间,Component可能处于激活/未激活、可见/不可见的状态。
1. Activity堆栈
每个Actvity的状态由它所在Activity栈中的位置所决定,所有当前正在运行的Actvity将遵循照后进先出的原则。当一个新的 Activity启动,当前的Activity将移至堆栈的顶部,如果用户使用Back按钮,或在前台Activity被关闭,下一个Activity将被激活并且移至到堆栈的顶部。这个过程如下图所示:
2. Activity 状态
随着Activity的创建和销毁,也就会进出栈如上图所示,其中可能会经历以下四种状态:
- Active状态:这时候Activity处于栈顶,且是可见的,有焦点的,能够于用户互动。当另一个Activity变成Active时,当前 的将变成Paused状态;
- Paused状态:Activity仍然可见但没有焦点,在这时候Actvity处于Paused状态(例如,如果有一个透明或非全屏幕上的Activity在你的Actvity上面)。处于Paused状态的Actvity是alive的(保持状态、成员信息并绑定到窗口管理器),但当系统内存不足的时候会被killed;
- Stopped状态:当Activity是不可见的时,Activity处于Stopped状态(仍可以保存状态和成员信息,但不绑定在窗口管理器)。假设系统需要内存的话,它是被回收对象的主要候选。当Activity处于Stopped状态时,一定要保存当前数据和当前的UI状态,否则一 旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
- Inactive状态:Activity被杀掉以后或者被启动以前,处于Inactive状态。这时Activity已被移除从Activity堆栈中,需要重新启动才可以显示和使用。
public class MyActivity extends Activity { // 在Activity生命周期开始时被调用 public void onCreate(Bundle icicle) { } // 当activity对用户即将可见的时候调用。 public void onStart() { } // 当activity从停止状态重新启动时调用 public void onRestart() { } // 当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它 public void onResume() { } // 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用 // CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。 public void onPause() { } // 当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。 public void onStop() { } // 在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况 public void onDestroy() { } // onCreate完成后被调用,用来回复UI状态 public void onRestoreInstanceState(Bundle savedInstanceState) { } // Activity即将移出栈顶保留UI状态时调用此方法 public void onSaveInstanceState(Bundle savedInstanceState) { } }
OPhone Runtime将首先杀掉处于Stopped状态的Activity,在极端情况下,也会杀掉那些处于Paused状态的Activity。 为确保无缝的用户体验,这些状态之间的过渡对用户来说应该做到透明的。不管Activity处于那种状态,最重要的是保留好UI状态和用户数据,一旦Actvity被激活,用户都能看到他想要的东西。
你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下Bundle savedInstanceState是否为空。
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...
3. Activity周期
(1)完整生命周期:开始于调用onCreate()(初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程),在OnCreate方法的参数Bundle包含最后一次调用onSaveInstanceState保存的UI状态,你可以使用这个Bundle恢复用户界面到以前的状态,无论是在OnCreate方法或通过覆盖onRestoreInstanceStateMethod方法
。为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响,如果你的Activity需要创建一些对象的话,最好在onCreate方法中创建,因为在Actvity的完整生命周期中它仅会被调用一次;结束于调用onDestroy()(释放所有的资源,确保所有外部连接被关闭,例如网络或数据库的连接)。有时,OPhone Runtime将杀掉一个Activity且不调用onDestroy()。
(2)可见生命周期:开始于onStart()结束于onStop()。在这期间此Acitvity是可见的(尽管它可能没有焦点,也可能部分被遮挡着)。OnStop方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序,当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序 ,当一个Activity被重现可见时onRestart方法优先于onStart被调用。OnStart / OnStop方法也被用来注册和注销Broadcast Reciever 。在一个Activity完整生命周期中可能会经过几个Activity可见生命周期。在极端情况下,OPhone Runtime将杀掉一个Activity即使它在可见状态并且并不调用onStop方法。
(3)活跃生命周期:始于onResume()方法,结束于onPause()方法。一个活跃的Actvity总是在前台并且接收用户输入事件。因为用户会频繁的从暂停、恢复状态切换(例如,当设备待机或一个新的activity启动的时候onPause()会被调用;当传入一个新的intent进来时onResume()被调用。因此,这2个方法内的代码应该是轻量级的以确保您的应用程序能够快速响应Acitvity在前台和后台之间切换。 在调用onPause之前onSaveInstanceState会被调用保存UI状态(如检查按钮状态,用户焦点,未提交用户输入) ,这个方法提供了一个机会保存当前的UI状态到Bundle当中。 Bundle信息将会被传递到OnCreate和onRestoreInstanceState方法 。
4. Activity生命周期示例
必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示
(1)父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart() --> onStart(),onResume() …
(2)用户点击Home,Actvity调用顺序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe --> onDestroy() – Maybe
(3)调用finish(), Activity调用顺序如下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上显示dialog, Activity调用顺序如下
AAA
(5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下
AAA --> onFreeze() --> onPause()
(6)设备进入睡眠状态,Activity调用顺序如下
AAA --> onFreeze() --> onPause()
发表评论
-
如果在Eclipse中debug
2010-05-02 14:15 0最基本的操作是: 1, 首先在一个java文件中设断点,然后 ... -
How to download sourcecode of android with cygwin
2010-04-14 16:07 5115cygwin是一个在windows平台 ... -
TelephoneManager
2010-03-08 16:04 01. protected void onCreate(Bun ... -
eclipse c
2010-03-07 21:05 0Eclipse 除 了可以开发Java之外,还支持了许 ... -
android sdk安装
2010-02-02 23:37 34901.下载:http://developer.android.c ... -
google map my demo
2010-02-02 23:36 3202<uses-library android:name=& ... -
Toast
2010-02-02 23:35 14791. (1) public class ToastActi ... -
如何在MapView上画图
2010-02-02 23:34 1585http://ophone8.com/thread-4340- ... -
Service
2010-02-02 23:33 31571. Service生命周期 (1)Servic ... -
Notification
2010-02-02 23:33 19381. Notification构造器的参数 分别为: ... -
导航相关概念
2010-02-02 23:32 17031. Google Map的定位 (1)Goog ... -
PendingIntent和Intent
2010-02-02 23:28 9530Notification n = new Notificati ... -
Broadcast调用Service做的一个定时器
2010-02-02 23:28 37131. public class AlarmActivity ... -
Broadcast Receiver
2010-02-02 23:27 8693Broadcast Receiver用于接收并处理广播通知(b ... -
LayoutInflater
2010-02-02 23:27 21812一般来讲,我们用LayoutInflater做一件事:infl ... -
Activity文档翻译
2010-02-02 23:26 1602转自:http://www.blogjava.net/m ... -
Intent
2010-01-20 10:51 011 public class MumActivity ex ... -
aidl
2010-01-05 11:24 30641. android进程之间如何通讯呢(在不同的进程中怎样传递 ... -
Gallery 画廊
2009-12-17 20:25 33801. images.xml <?xml ver ... -
Intent中的Flag参数
2009-12-16 18:12 6488Intent i = new Intent(B.this, C ...
相关推荐
Android消息总线,基于LiveData,具有生命周期感知能力使用方法Fork本项目或者直接拷贝源码:LiveDataBus.java依赖依赖Android Architecture Components,具体可参见gradle文件build.gradle示例及Demo订阅消息...
组件在插件架构中承担着初始化和配置的任务,它们在启动时加载并贯穿整个插件的生命周期。主要有三种类型的组件: 1. **ApplicationComponent**:此类组件在整个应用程序级别运行,适用于那些需要在所有项目中都...
这样,我们可以使用`bindUntilEvent()`方法将Observable的生命周期与Android组件的生命周期事件关联起来。例如,在上面的代码中,`bindUntilEvent(ActivityEvent.PAUSE)`会确保在Activity暂停时取消订阅,防止内存...
同时,通过uni-app的生命周期管理,确保组件和页面的高效渲染。 总结来说,“S-LOVE多端恋爱小站小程序”是uniapp框架下的一次成功实践,它展示了如何利用uniapp进行多端开发,实现了在H5和微信小程序平台上的无缝...
LiveData是Android Architecture Components库中的一个关键组件,它是一个有生命周期感知能力的可观察数据持有者。这意味着当观察者(如Activity或Fragment)处于活动状态时,LiveData会通知它们数据的变化;当观察...
Fragment和Activity都具有各自的生命周期,当它们之间进行通信时,必须考虑生命周期的同步。例如,在Activity的onCreate()方法中添加Fragment,确保Fragment在Activity的生命周期内正确初始化。同时,Fragment也可以...
理解和掌握ProgresApp涉及到JavaScript基础知识、框架使用、生命周期管理、导航、状态管理和调试技巧等多个方面,这些都是成为一名专业ProgresApp开发者的必备知识。通过UCAB的教程或类似资源,学习者可以系统地学习...
脚本部分定义组件的逻辑,包括数据、方法、生命周期钩子等。样式部分则可以编写CSS来控制组件的样式,支持 scoped 属性来限制样式的作用域,避免样式污染。 在构建APK前端时,我们还需要考虑如何处理数据流。Vue.js...
1. **React Components**:React Native基于组件化的开发方式,将UI拆分成可重用的组件,每个组件都有自己的状态和生命周期方法,通过props(属性)传递数据,方便地组合成复杂的界面。 2. **Native Modules**:...