一、App入口

  Android程序启动后的第一个入口点是Application的onCreate():

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        Log.d(TAG, "这里是Android程序入口");
        super.onCreate();
    }
}

  在Android3.1版本后,每个App都必须要有至少有一个Activity,Application的onCreate()之后系统会进入第一个Activity,该启动Activity在AndroidManifestxml中须用Intent Filter配置如下::

<activity android:name="xxxActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />          
    </intent-filter>
</activity>

  此后便从Activity的onCreate(Bundle savedInstanceState)开始进入组件的生命周期。

二、App启动过程

android软件使用教程 androidappon_安卓生命周期

三、App生命周期

   由上图可知系统在App启动时会创建一个Application实例(单例),如果你实现了Application的子类如MyApplication(通常没有必要实现),则是创建MyApplication的实例。Application的生命周期贯穿整个App运行全过程,从App启动到App完全终止运行。如下图所示:

android软件使用教程 androidappon_生命周期_02

  • onCreate():Application创建的时候调用
  • onConfigurationChanged(Configuration newConfig):当配置信息改变的时候会调用,如屏幕旋转、语言切换时。
  • onLowMemory():Android系统整体内存较低时候调用,通常在这里释放一些不重要的资源,或者提醒用户清一下垃圾,来保证内存足够而让APP进程不被系统杀掉。它和OnTrimMemory中的TRIM_MEMORY_COMPLETE级别相同。
  • onTrimMemory(int level):Android 4.0 之后提供的一个API,用于取代onLowMemory()。在系统内存不足的时会被调用,提示开发者清理部分资源来释放内存,从而避免被 Android 系统杀死。详见《Android代码内存优化建议-OnTrimMemory优化
  • onTerminate():Application结束的时候会调用,由系统决定调用的时机

MyApplication通常可用来在onCreate()中完成下列工作

  • 简单初始化,不要执行耗时操作,否则会拖慢APP启动速度
  • 定义全局常量或变量,要避免内存泄漏(可以用普通单例实现来代替)
  • 定义全局静态方法(可以用普通类实现来代替)

四、进程优先级

android软件使用教程 androidappon_生命周期_03

  1. Activity Process
    活动进程,也叫前台进程。Android会尝试通过回收各种资源来保证其运行状态。此类进程数量少,通常是最后被结束掉的。活动进程包含下面几种情况:
    — 进程持有一个正在与用户交互的Activity(这个Activity的onResume()方法被调用)。
    — 进程持有一个Service,这个Service处于这几种状态:①Service与用户正在交互的Activity绑定。②Service是在前台运行的,即它调用了 startForeground()。③Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。
    — 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法。
  2. Visible Process
    可见进程,如果一个进程不含有任何前台活动的组件,不可与用户交互,但仍在屏幕上可见。可见进程包含下面几种情况:
    —进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态)。
    —进程持有一个Service,这个Service和一个可见的或者活动的Activity绑定。
  3. Started Service Process
    启动后的服务进程,该服务进程在没有可视化界面的情况下持续运行时。
  4. Background Process
    后台进程,持有一个用户不可见的Activity(Activity的onStop()被调用,但是onDestroy()没有调用)的状态。通常有很多后台进程在运行。它们被保存在一个LRU(最近最少使用)列表中来确保拥有最近刚被看到的Activity的进程最后被杀死。
  5. Empty Process
    空进程,不拥有入何活动组件的进程。为了改善整个系统的性能,Android会在内存中保留已经结束生命周期的应用程序,以便这些App能够快速启动。

➤ Android按照上述优先级来结束一个进程,系统在内存不够用时,会从优先级等级低的开始杀死进程(1~5级,由高到低),以便为更高等级的进程腾出宝贵的内存空间。
➤ 同一个应用的所有组件在默认情况下都运行在同一个进程中,但也可以通过修改manifest文件中的android:process属性来指定该组件要运行在哪个进程,也可以让不同应用的组件们运行在同一个进程中,当然这些应用要共享同一个用户ID并且有相同的数字证书。
➤Android会尽可能高的估量一个进程的级别。比如,一个进程拥有一个可见状态的Activity和一个Service,这个进程会被认为是可见进程,而不是服务进程。
➤ 一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供服务的进程级别永远高于使用它服务的进程

五、Demo

android软件使用教程 androidappon_生命周期_04