Android - Activity

 

每次新Activity启动时,前一Activity便会停止,但系统会在Activity"返回栈"中保留该Activity。

当新Activity启动时,系统会将其压入返回栈栈顶,并取得用户焦点。

当用户完成当前Activity并按"返回"按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一Activity。


二、管理 Activity 生命周期

Activity基本上以三种状态存在:

  1、已继续(运行中):此Activity位于屏幕前台并具有用户焦点;

  2、已暂停:另一个Activity位于屏幕前台并具有用户焦点,但此Activity仍可见;

  3、已停止:该Activity被另一个Activity完全遮盖,该Activity目前位于"后台";

  [注] 已暂停与已停止状态下,Activity仍处于Activity状态(Activity对象保留在内存中,它保留了所有状态和成员信息)


  1) Activity的整个生命周期发生在onCreate()调用和onDestroy()调用之间。

    如果Activity有一个后台运行的线程,可能会在onCreate()中创建线程,然后在onDestroy()中停止线程;

  2) Activity的可见生命周期发生在onStart()调用和onStop()调用之间。这段时间,用户可以在屏幕上看到Activity并与其交互。

      可以在onStart()中注册一个BroadcastReceiver以监控影响UI的变化,并在用户无法看到显示内容时在onStop()中将其取消注册;

  3) Activity的前台生命周期发生在onResume()调用和onPause()调用之间。这段时间,Activity位于屏幕上所有其他Activity 之前,并具有用户输入焦点。

     当设备转入休眠状态或出现对话框时,系统会调用onPause(),由于Activity可频繁转入和转出前台,因此这两个方法中应采用适度轻量级代码;

 

  onPause()、onStop()、onDestroy() 这三个方法中任意一个返回后,系统才可以随时终止承载Activity的进程;

  由于onPause()是这三个方法中的第一个,因此Activity创建后,onPause()必定成为最后调用的方法,然后系统才能终止进程;

  如果系统在紧急情况下必须回收内存(杀死进程),则可能不会调用onStop()和onDestroy(),因此,您应该使用onPause()向存储设备写入重要的持久性数据(仍需轻量级代码);


  [注] 区分系统销毁某项Activity vs 系统终止承载Activity的应用进程。

 

三、保存 Activity 状态

  当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁;

  销毁Activity时,系统会先调用onSaveInstanceState(),您可以在该回调方法中对有关Activity状态信息进行保存 (Activity出栈不会调用onSaveInstanceState());

  重建Activity时,系统会将Bundle(保存信息)同时传递给onCreate()和onRestoreInstanceState();

 

  [注] 无法保证系统会在销毁您的Activity前调用onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用"返回"按钮离开您的Activity时,因为用户的行为是在显式关闭 Activity)。

  如果系统调用onSaveInstanceState(),它会在调用onStop()之前,并且可能会在调用onPause()之前进行调用。  

 

  [注] 由于无法保证系统会调用onSaveInstanceState() (例如用户使用"返回"按钮离开Activity),因此您只应利用它来记录Activity的瞬态(UI的状态),

  切勿使用它来存储持久性数据,而应使用onPause()在用户离开Activity后存储持久性数据(例如应保存到数据库的数据)。

 

  [注] 在两种情况下,Activity会调用onSaveInstanceState():

  1.系统销毁Activity后重建Activity,Activity必须恢复之前保存的状态;

  2.Activity失去栈顶位置,但是重回栈顶时,不会调用onRestoreInstanceState

四、任务&启动模式

  两种方法设置启动模式:1、清单文件 2、Intent标志 ; 两者同时使用时,Intent标志优先级高于清单文件中所定义;

  singleTop: 你最通常使用模式为singleTop(除了默认standard模式),这不会对任务产生影响,仅仅是防止在栈顶多次启动同一个活动;

        如果目标Activity处于栈顶,则系统不会再去创建一个Activity实例,而是调用栈顶Activity的onNewIntent()方法;

  singleTask: 在新任务中启动 Activity。如果已为正在启动的 Activity 运行任务,则该任务会转到前台并恢复其最后状态,同时 Activity 会在 onNewIntent() 中收到新 Intent。

        位于目标Activity上面的其它Activity会调用Destroy()并弹出返回栈;

        这个模式最好被用于应用程序入口活动的标记中; 声明为这种模式的Activity,在同一个任务当中只会存在一个实例;

  singleInstance: 与 "singleTask" 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。

 

  FLAG_ACTIVITY_NEW_TASK: 与 "singleTask" launchMode 值相同的行为;

  FLAG_ACTIVITY_SINGLE_TOP: 与 "singleTop" launchMode 值相同的行为;

  FLAG_ACTIVITY_CLEAR_TOP: 如果正在启动的Activity已在当前任务中运行,则会销毁当前任务顶部的所有Activity,让启动的Activity位于顶部,并通过onNewIntent()将此Intent传递给Activity;

  [注]如果指定Activity的启动模式为"standard",则该Activity也会从堆栈中删除,并在其位置启动一个新实例,以便处理传入的Intent;通常与FLAG_ACTIVITY_NEW_TASK结合使用;

  [注] 每一个activity实例都仅存在于一个进程和一个任务中。这也是进程与任务的唯一类似的地方。任务只包含activity,这些activity通常来自于不同应用。而进程则包含了应用的全部运行代码和对象。

  Activity是否保存状态取决于用户离开它的方式:Home or Back Button
  Back Button: destroys the activity and returns to the previous activity. (You can override the normal back behavior,preventing the activity from being destroyed)
  Home Button: the activity is stopped and moved to the background rather than being destroyed.

  multiple applications may share processes, or one application may make use of multiple processes depending on its needs.

 

相关文章:

  博客:郭霖 http://blog.csdn.net/guolin_blog/article/details/41087993

  技术小黑屋:「深入讲解Android中Activity launchMode」 http://droidyue.com/blog/2015/08/16/dive-into-android-activity-launchmode/


 

 

 

 

 




posted @   chenyizh  阅读(131)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示