1. Boot系统初始化, 具体过程参见(system/core/init/Init.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。
2. 初始化成功后,就开始mounting系统,具体参见(system/core/mountd/Mountd.c)中的main函数。注意: main函数中的configPath要参照实际目录更改。
3.接下来运行androidRuntime,并开始启动java虚拟机dalvik vm。
4. Java虚拟机启动成功后,开始系统初始化。系统初始的第一步是用JNI方式实现的,对应java代码为(frameworks/base/services/java/com/android/server/SystemServer.java) init1(Native)函数,对应的JNI C++代码为(frameworks/base/core/jni/server/com_android_server_SystemServer.cpp),而实现的C++代码为
(frameworks/base/cmds/system_server/library/ System_init.cpp)中的system_init()函数。
5. system_init()函数调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。
6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.java中的SystemServer.init2()。ServerThread将启动各种系统服务,如Power Manager、Activity Manager等等,具体参见ServerThread的run函数。
7.这之后的事,应该就是进入系统了。
******************************************************************************************************
从下图中可以看出Activity的生命周期函数挺多的,其实他的生命周期和以往我们看到的其他组件的生命周期一样,都是从创建到销毁的过程,只不过之间多加了几个生命周期函数。

我们可以使用一个apk来验证两个activity相互切换的过程和退出activity的过程。通过在每个步骤函数中打印TRACE,可以发现创建、运行、到销毁的流程。

(1)从Activity01切到Activity02

步骤是:Activity01.onCreate-》Activity01.onStart-》Activity01.onResume-》Activity01.onPause-》Activity02.onCreate-》Activity02.onStart-》Activity02.onResume-》Activity01.onStop-》Activity01.onDestroy。从上可以看出,直到Activity02创建完毕后,Activity01才完全销毁。

(2)从Activity01退出

步骤是:Activity01.onCreate-》Activity01.onStart-》Activity01.onResume-》Activity01.onPause-》Activity01.onStop-》Activity01.onDestroy

如果想完整的退出一个activity,光用finish是不够的。仅仅finish掉,用360一查,发现进程还是存在的;当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放。所以正确的做法是在onDestroy中调用System.exit。

==========================================================================================================

某些时候,我们需要在开机时启动一个activity,做法就是为这个activity的class配一个receiver就可以了。方法是:

(1)activity本身不需要做任何改动

(2)XML中添加开机启动权限

<span style="font-size:12px;"><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission></span>

(3)XML中receiver

<span style="font-size:12px;">        <receiver android:name=".BootBroadcastReceiver">              <intent-filter>                  <action android:name="android.intent.action.BOOT_COMPLETED" />              </intent-filter>          </receiver>  </span>

(4)BootBroadcastReceiver文件内容:

<span style="font-size:12px;">package com.example.screenorientationtest;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class BootBroadcastReceiver extends BroadcastReceiver {static final String ACTION = "android.intent.action.BOOT_COMPLETED";  @Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubif (intent.getAction().equals(ACTION)) {              Intent sayHelloIntent = new Intent(context, MainActivity.class);              sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);              context.startActivity(sayHelloIntent);          }  }}</span>

==========================================================================================================

this 常常引用当前的 context。但是有些时候,必须使用getBaseContext()来代替this。就是说使用this会引发错误,如下例:

<span style="font-size:12px;">Spinner spinner = (Spinner) findViewById(R.id.spinner);spinner.setAdapter(adapter);            spinner.setOnItemSelectedListener(new OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){       Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); //this line    }</span>

当把getBaseContext()变成this就会有错误。为什么这种情况下必须使用getBaseContext()方法,而不能使用this呢?

答案是:getBaseContext()是 ContextWrapper中的方法。this应用上下文返回activity的当前上下文,属于activity。但是在你的事例中它是指Spinner实例,因为onItemSelected方法是接口OnItemSelectedListener的函数实现方法。所以要在activity显示toast,必须跳出spinner。

===============================================================================================

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下主要说明常用的两个的差别:

(1)standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D D C B A将会依次弹出栈而显示在界面上。

如果设置为standard,说明有多个启动项,页面跳转时没有销毁关系。也就是说不管跳转到哪个页面,按HOME键后再运行该应用,会激活最后存在的那个acitivity。

(2)singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。

意即应用运行时,不管跑到哪个页面。按HOME键后再运行应用,还是跳转到启动页,之前栈顶的不复存在。
(3)singleInstance:文档中是这样说的,你设置成了singleInstance,. It's the only activity in the task。


参考原文:http://www.iteye.com/topic/1092061

参考原文:http://blog.csdn.net/u0fly/article/details/5909477(后部分)

参考原文:http://ask.csdn.net/questions/942

参考原文:http://blog.csdn.net/kevinofneu/article/details/20307005

参考原文:http://blog.csdn.net/eiuly/article/details/22779069

参考原文:http://bbs.csdn.net/topics/350051074

参考原文:http://blog.csdn.net/yanzi1225627/article/details/8592883

更多相关文章

  1. C语言函数的递归(上)
  2. Android(安卓)Compile
  3. 1.Android系统架构
  4. The Busy Coder's Guide to Android(安卓)Development 学习
  5. android中添加AT命令流程(转载)
  6. Android(安卓)音视频学习系列(一) JNI 从入门到精通
  7. android之ListView自定义布局
  8. Android(安卓)简介及基础知识
  9. Android(安卓)使用GPS定位获取经纬度的方法

随机推荐

  1. Android程序优化之对屏幕旋转的处理总结
  2. [置顶] Android 网络连接--Wifi/3G
  3. android软键盘弹出引起的各种不适终极解
  4. Activity学习日记(一)
  5. windows环境下进入到android 模拟器
  6. Android O: 触摸事件传递流程源码分析(上
  7. 探究Android之ClassLoader
  8. 收藏各种技术源码
  9. Android(安卓)应用程序的组成部分
  10. postInvalidate(),invalidate(),requestLay