Android复习之旅--Activity

【修改后】
对于Activity是什么,相信大家都十分清楚了。在这里我就不扯那么多废话了。这里就说一下Android中的线程、进程、任务栈,Activity的启动模式还有现场保存问题。

什么是进程?

进程是操作系统分配内存空间的单位,每个进程的内存空间都是独立的。
在Android系统中,应用程序退出和进程退出是两个不同的概念,Android系统为了让应用程序可以被快速地开启,所以应用程序退出后,进程是不会退出的,只有系统的内存空间严重不足的时候,才会把进程给回收。当然,用户可以手动退出进程。

什么是线程?

线程是运行在进程里面的。是cpu执行的最小单位。如果进程挂了,线程也挂了。

什么是任务栈?

任务栈记录当前用户操作的行为的一种数据结构。(先进后出的数据结构)
一个应用程序默认是只有一个任务栈,特殊情况下singleInstance会有多个任务栈


Activity的Launch Model

Android采用任务栈(Task)的方式来管理Activity的实例。当启动一个应用时,Android就会为之创建一个任务栈。先启动的Activity压在栈底,后启动的Activity放在栈顶,通过启动模式可以控制Activity在任务栈中的加载情况。
栈的原则是“先进后出”

  • standard
    -- 每次都新建一次实例对象,开启新的Activity,Activity就会被创建出来,加入到任务栈的栈顶,适用于绝大多数的应用场景。但如果应用中Activity数量较多,每次开启新的Activity都需新建一个实例,实在是浪费资源。为了优化应考虑以下三种模式

标准模式,默认。

  • singleTop
    -- 扫描栈顶,如果发现这个Activity已经被启动了,并且在任务栈的栈顶,Activity就不会被重新创建。避免已经打开的界面重复的被打开多次

在activity节点中加入 android:launchModel="singleTop"

  • singleTask
    -- 扫描全栈,开启新的activity的时候,回去检查任务栈里面是否有这个Activity的实例存在,如果有实例存在,就直接清空这个实例上面的所有Activity,复用这个已经存在的activity实例。
    如果一个activity的资源开销非常大,建议使用singleTask的启动模式。浏览器的Activit使用的就是singleTask的启动模式。

在activity节点中加入 android:launchModel="singleTask"

  • singleInstance
    -- 允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用。即在整个Android手机操作系统里面只有一个Activity的实例存在。
    singleInstance启动模式的Activity会运行在自己单独的任务栈里面
    手机通话的Activity配置模式就是singleInstance

在activity节点中加入 android:launchModel="singleInstance"


数据传递

Android复习之旅--Intent

数据保存

如果用户正在玩游戏或正在进行某些重要的业务处理时应用异常退出或者不小心把手机横竖切换了一下,导致当前Activity销毁重建,用户之前的操作都被销毁了,如果这样子来多几次,用户会疯掉的。
so,解决的方案目前有三种

  • Activity现场保存

将要保留的数据保存到Bundle对象中
当然,对于复杂的数据也可以保存到数据库中

  @Override
  protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      //TODO 保存的数据
      outState.putString("name", "飘渺云轩");
   }

  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
      //TODO 取出保存的数据
      String name = savedInstanceState.getString("name");
      Toast.makeText(this, name, Toast.LENGTH_LONG).show();
  }
  • 把屏幕朝向写死(在AndroidManifest.xml文件中的activity节点里设置)

      android:screenOrientation="landscape" 横屏
      android:screenOrientation="portrait" 竖屏
    
  • 设置横竖屏切换不敏感(在AndroidManifest.xml文件中的activity节点里设置)

      android:configChanges="orientation|keyboardHidden|screenSize"

推荐阅读更多精彩内容