我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个HealthFood 源码 百度搜就知道很多下载的地方
前面几篇文章已经介绍完了这个应用程序的所有的东西,但是还要有些没有实现的功能,比如搜索,刷新,等
但是最关键的问题是:应用程序的生命周期没有处理
导致一个问题出现了:当我多次查看item的时候,会创建很多个activity,那么在任务栈中是有非常多的activity,需要点击多次返回操作
这是一个非常不好的用户体验。
首先我们看看界面显示的效果:
关于软件生命周期,对于开发app应用程序来说,这一直是要熟记于心的!!!下面我们来看看软件应用程序的生命周期的相关知识
首先我们简单的创建一个hello程序,在mainActivity主进程类中重载这几个函数:onStart(),onResume(),onPause(),onStop(),onRestart(),onDestroy()
代码语言:javascript复制import com.jsr.test.R;
import android.app.Activity;
import android.os.Bundle;
public class HelloJsr extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
System.out.println("onCreate");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("onStart");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("onStop");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("onRestart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("onResume");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("onDestroy");
}
}
运行部署下代码到模拟器上,看看logcat里面打印的是什么东西:
怎么去在日记打印控制台上找到System.out.呢?
这里当我们的程序只是部署到模拟器上,可以看到应用程序执行各个函数的顺序:
1.onCreate()
2.onStart()
3.onResume()
此时模拟器的界面如下:
接下来我们继续往下走:点击返回菜单,看看发生了什么?
可以看到当点击返回菜单时,logcat里面多了两行输出:
4.onStop()
5.onDestroy()
这个时候模拟器的界面如下所示:返回了手机主界面
如此一来,我们就可以看到一个简单的hello应用程序的activity的生命周期了:
activity创建时:
1.onCreate()
2.onStart()
3.onResume()
activity销毁时:
4.onStop()
5.onDestroy()
那么我们现在就需要去了解这些函数他们的机制是什么,到底有什么作用,到底在什么样的情况下被调用呢?
1.void onCreate(Bundle savedInstanceState)
当activity被第一次加载时执行onCreate()事件,当启动一个程序的时候,其主窗体的onCreate事件就会被执行。此时任务栈中就会多了这样一个activity
2.void onStart()
在onCreate()事件之后执行onStart()事件。
3.void onResume()
onStart()事件执行之后执行onResume()事件。
4.void onStop()
如果用户直接按了Back()键,意味着将当期的activity从Task任务中移除,也就是执行了该窗体的onStop()事件
5.void onDestroy()
当activity被销毁的时候执行onDestroy()事件,在窗体的onStop()事件之后,如果没有再次查看该窗体的话,activity则会被销毁。
上面的分析就是这个简单的hello程序操作时的一个生命周期,接下来我们再看看,直接按Menu菜单键,然后再返回程序时是怎么样的。
首先是程序打开
执行了三个函数:onCreate(),onStart(),onResume()
接下来我们按返回主界面菜单:结果如下所示
这个时候logcat只打印了一行,执行了onStop()事件
接下来我们再返回这个应用程序:
如上操作,我们可以看到这样的结果:
程序此时打印了三个输出,也就是说执行了三个函数,他们的顺序为:onRestart(),onStart() ,onResume()
接下来我们按返回按钮看看打出什么日志:
此时输出了两个日志, 执行了两个函数,他们的顺序为:onStop(),onDestroy()
这样一套操作下来,我们很清楚了看到了应用程序的activity的生命周期是什么样子的:
10-27 09:04:08.397: I/System.out(1329): onCreate 10-27 09:04:08.397: I/System.out(1329): onStart 10-27 09:04:08.407: I/System.out(1329): onResume 10-27 09:04:55.847: I/System.out(1329): onStop 10-27 09:06:23.757: I/System.out(1329): onRestart 10-27 09:06:23.757: I/System.out(1329): onStart 10-27 09:06:23.757: I/System.out(1329): onResume 10-27 09:11:42.077: I/System.out(1329): onStop 10-27 09:11:42.087: I/System.out(1329): onDestroy
我们来分析一下:
1.void onCreate(Bundle savedInstanceState)
如果activity被销毁之后,再重新加载它时,onCreate()事件也会被重新执行;如果activity没有被销毁,而依然存在任务栈中的话,下次进入该应用程序的时候onCreate()事件不会再被执行,也就是说在一个activity完整事件中,onCreate()事件只会被执行一次。
这里我们从点击返回主界面菜单的时候,然后再进入该应用的时候,没有执行onCreate可以看出来。他直接执行了onRestart()
2.void onStart()
当 当前窗体被交换到后台的时候,在用户重新查看窗体前已经过去了一段时间,窗体已经执行了onStop()事件,但是窗体和其所在的进程并没有被销毁,用户再次重新进入窗体的时候会执行onRestart()事件,之后会跳过onCreate()事件,直接执行了窗体的onStart()事件
3.void onResume()
当 当前的窗体被交换到后台后,在用户重新查看窗体时,窗体还没有被销毁,也没有执行过onStop()事件,activity还存在任务栈中,则会跳过onCreate事件,在onStart()事件之后,紧接着执行onResume()事件[其实这个事件,可以这样记,就是屏幕焦点存在,可以触摸]
4.onRestart()
onStop()事件之后执行onRestart(),如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看了该窗体的时候,则会执行窗体的onRestart()事件,onREstart()事件之后,会跳过onCreate()事件,直接执行onStart()事件
当这样做了之后我们就可以弄清楚这些函数的执行周期了,他们在什么时间内开始执行,什么时候结束执行,
接下来还有一个函数的执行没有看到,那就是onPause()事件
看了下源代码,原来我没有把这个函数重载,哈哈哈,我说怎么没有找到这个函数呢
这里就不再重做了,
onPause()事件是当窗体被交换到后台时执行。
activity的生命周期很重要是因为:
1.在进行手机系统应用开发时,大多数情况下只能在手机上看到一个程序的一个界面,用户除了通过程序界面上的功能按钮在不同的窗体间进行切换,还可以通过Back和Home来返回一个窗口,而用户使用Back和Home键的时候是非常不确定的,任何时候用户都可以使用它们来强行切换当前的界面
2.通常手机上的一些特殊的事件发生也会强制的改变当前用户的所处的状态,例如:无论任何情况下,在手机来电时,系统都会优先显示电话接听界面
有了这些特殊的特性之后,我们就必须要知道activity的生命周期是什么样的了!!!!!
我们来看看官网的介绍:
先写到这里把,下次遇到再继续补充了