Android应用程序里提供的Eclipse插件使得运行我们的程序非常简单。选择Run > Open Run Dialog菜单;你会看到一个对话框,在这个对话框中就像配置J2ME运行环境一下,配置一个Luncher。
大功告成!点击run按钮,Androi模拟器将运行。当模拟器启动完成你将看到你的程序。到这里我们就完成了!按照正常思路,一定会想,程序入口点在哪里呢?为什么会从这个Activity 启动呢?
现在用我们自己的最容易理解的方式来表述:这是因为当启动这个程序的映像文件时,会发送一个事件对象Intent, 带有MAIN的行为属性,而自动生成的代码及文件, 有一个AndroidManifest.xml会为HelloWorld这个Activity 配置一个事件过滤器,表明实现了MAIN action,LAUNCHER category的入口点行为。请注意其中的几行:
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- TextView tv = new TextView(this);
- tv.setText("Hello, Android");
- setContentView(tv);
- }
在多数情况下, 每个Android应用程序运行在自己的Linux进程中. 当一个应用的某段code需要运行的时候这个进程将会被创建, 直到不再需要该应用或系统要为其他的应用释放内存的时候才停止.
一个非常重要且少有的特性是, 应用进程的存活时间不是由这个应用直接控制的. 而是由系统决定的, 系统会根据每个已知的正在运行的应用情况来定夺, 包括, 该应用对用户的重要性和系统全部可用内存.
对于开发人员来讲, 了解每个应用组件(尤其是, Activity, Service, 和IntentReceiver)对于应用进程存活时间的影响是非常重要的. 如果没有正确使用, 可能会导致应用进程在处理重要工作的时候被系统杀掉.
在对应用进程生命周期的理解中, 一个典型的错误就是当一个IntentReceiver 接收到Intent 之后, 会在自己的onReceiveIntent()方法中开起一个线程。而后return这个方法. 一旦这个方法return, 系统会认为这个IntentReceiver 不在处于活跃状态, 也就认为他的宿主进程不再需要(除非还包有其他活跃的应用组件)。
以至于当系统需要回收内存的时候会随时释kill掉这个进程, 中止其中的子线程. 解决这个问题的办法是在IntentReceiver中启动一个Service, 这样系统会知道在这个进程中还有活跃的任务需要完成. 为了决定在内存较低的时候杀掉哪个进程, Android应用程序会根据运行在这些进程内的组件及他们的状态把进程划分成一个"重要程度层次". 其重要的程度按以下规则排序:
前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时),也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程。
在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应。