zoukankan      html  css  js  c++  java
  • Android Training

    copy from : http://hukai.me/android-training-managing-the-activity-lifecycle-lesson-1/

    • 不像其他编程范式一样:程序从main()方法开始启动。Android系统根据生命周期的不同阶段唤起对应的回调函数来执行代码。系统存在启动与销毁一个activity的一套有序的回调函数。

    • 这一个课会介绍那些生命周期中最重要的回调函数,并演示如何处理启动一个activity所涉及到的回调函数。

    理解生命周期的回调

    • 在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期回调方法。Activity生命周期的每一个阶段就像金字塔中的台阶。当系统创建了一个新的activity实例,每一个回调函数会向上一阶的移动activity状态。金字塔顶端意味着activity是跑在最前端的并且用户可以与它进行交互。
    • 当用户开始离开这个activity,为了卸载这个activity,系统会调用其它方法来向下一阶移动activity状态。在某些情况下,activity会隐藏在金字塔下等待(例如当用户切换到其他app),这个时候activity可以重新回到顶端(如果用户回到这个activity)并且恢复用户离开时的状态。

    Figure 1. 下面这张图讲解了activity的生命周期:(这个金字塔模型要比之前Dev Guide里面的生命周期图更加容易理解,更加形象)

    basic-lifecycle

    • 根据你的activity的复杂度,你也许不需要实现所有的生命周期方法。然而,你需要知道每一个方法的功能并确保你的app能够像用户期望的那样执行。如何实现一个符合用户期待的app,你需要注意下面几点:
      • 当使用你的app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。
      • 当用户没有激活某个组件的时候不要消耗宝贵的系统资源。
      • 当离开你的app并且一段时间后返回,不要丢失用户的使用进度。
      • 当设备发送屏幕旋转的时候,不会crash或者丢失用户的使用进度。
    • 在下面的课程中会介绍上图所示的几个生命状态。然而,其中只有三个状态是静态的,这三个状态下activity可以存在一段比较长的时间。(其它几个状态会很快就切换掉,停留的时间比较短暂)
      • Resumed:在这个状态,activity是在最前端的,用户可以与它进行交互。(通常也被理解为”running” 状态)
      • Paused:在这个状态,activity被另外一个activity所遮盖:另外的activity来到最前面,但是半透明的,不会覆盖整个屏幕。被暂停的activity不会再接受用户的输入且不会执行任何代码。(这里的不会执行任何代码并不代表了任何后台线程都不会工作)
      • Stopped:在这个状态, activity完全被隐藏,不被用户可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息都会被保留,但是activity不能执行任何代码。
    • 其它状态 (CreatedStarted)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。上面就是基本的activity生命周期。

    指定你的程序首次启动的Activity

    • 当用户从主界面点击你的程序图标时,系统会调用你的app里面的被声明为”launcher” (or “main”) activity中的onCreate()方法。这个Activity被用来当作你的程序的主要进入点。
    • 你可以在AndroidManifest.xml中定义哪个activity作为你的主activity。
    • 这个main activity必须在manifest使用包括 MAIN action 与 LAUNCHER category 的<intent-filter>标签来声明。例如:
    1
    2
    3
    4
    5
    6
    
    <activity android:name=".MainActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

    Note:当你使用Android SDK工具来创建Android工程时,工程中就包含了一个默认的声明有这个filter的activity类。

    • 如果你的程序中没有一个activity声明了MAIN action 或者LAUNCHER category,那么在设备的主界面列表里面不会呈现你的app图标。

    创建一个新的实例

    • 大多数app都包括许多不同的activities,这样使得用户可以执行不同的动作。不论这个activity是创建的主activtiy还是为了响应用户行为而新创建的,系统都会调用新的activity实例中的onCreate()方法。
    • 你必须实现onCreate()方法来执行程序启动所需要的基本逻辑。
    • 例如:下面的onCreate()方法演示了为了建立一个activity所需要的一些基础操作。如,声明UI元素 ,定义成员变量,配置UI等。(onCreate里面尽量少做事情,避免程序启动太久都看不到界面)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    TextView mTextView; // Member variable for text view in the layout
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Set the user interface layout for this Activity
        // The layout file is defined in the project res/layout/main_activity.xml
    file
        setContentView(R.layout.main_activity);
    
        // Initialize member TextView so we can manipulate it later
        mTextView = (TextView) findViewById(R.id.text_message);
    
        // Make sure we're running on Honeycomb or higher to use ActionBar APIs
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // For the main activity, make sure the app icon in the action bar
            // does not behave as a button
            ActionBar actionBar = getActionBar();
            actionBar.setHomeButtonEnabled(false);
        }
    }
    

    Caution: Using the SDK_INT to prevent older systems from executing new APIs works in this way on Android 2.0 (API level 5) and higher only. Older versions will encounter a runtime exception.

    • 一旦结束onCreate 操作,系统会迅速调用onStart() 与onResume()方法。你的activity不会在Created或者Started状态停留。技术上来说, activity在onStart()被调用后会开始被用户可见,但是 onResume()会迅速被执行使得activity停留在Resumed状态,直到一些因素发生变化才会改变这个状态。例如接受到一个来电,用户切换到另外一个activity,或者是设备屏幕关闭。
    • 在后面的课程中,你将看到其他方法是如何使用的,onStart() 与 onResume()在用户从Paused or Stopped状态中恢复的时候非常有用。

    Note: onCreate() 方法包含了一个参数叫做savedInstanceState,这将会在后面的课程 - 重新创建activity的时候涉及到。

    basic_lifecycle-create

    • Figure 2. 上图显示了onCreate(), onStart(), and onResume()是如何执行的。当这三个顺序执行的回调函数完成后,activity会到达Resumed状态。

    销毁Activity

    • activity的第一个生命周期回调函数是 onCreate(),它最后一个回调是onDestroy().系统会执行这个方法作为你 的activity要从系统中完全移除的信号。
    • 大多数 apps并不需要实现这个方法,因为局部类的references会随着activity的销毁而销毁,并且你的activity应该在onPause()与onStop()中执行清除activity资源的操作。然而,如果你的activity包含了你在onCreate时创建的后台线程,或者是其他有可能导致内存泄漏的资源,你应该在OnDestroy()时杀死他们。
    1
    2
    3
    4
    5
    6
    7
    
    @Override
    public void onDestroy() {
        super.onDestroy();  // Always call the superclass
    
        // Stop method tracing that the activity started during onCreate()
        android.os.Debug.stopMethodTracing();
    }
    

    Note: 系统通常是在执行了onPause()与onStop() 之后再调用onDestroy() ,除非你的程序在onCreate()方法里面就调用了finish()方法,。在某些情况下,例如你的activity只是做了一个临时的逻辑跳转的功能,它只是用来决定跳转到哪一个activity,这样的话,你需要在onCreate里面去调用finish方法,这样系统会直接就调用onDestory方法,其它生命周期的方法则不会被执行。

    Always Believe Something Beauitful Will Be Happen
  • 相关阅读:
    Github创建远程库
    注册和登录Github
    Github简介
    一个成都程序猿写于离开北京一周年与26岁生日的这一天。
    【原创】面试时遇到『看门狗』脖子上挂着『时间轮』,我就问你怕不怕?
    【编程玄学】一个困扰我122天的技术问题,我好像知道答案了。
    【原创】(求锤得锤的故事)Redis锁从面试连环炮聊到神仙打架。
    【原创】面试官:你回去等通知吧!
    【原创】面试官问我G1回收器怎么知道你是什么时候的垃圾?
    【原创】面试官:你说你熟悉jvm?那你讲一下并发的可达性分析
  • 原文地址:https://www.cnblogs.com/Oude/p/12402212.html
Copyright © 2011-2022 走看看