Hi 大家好
今天我准备花一节课来讲讲Activity的生命周期,这个概念还是比较重要的,相信大家看书或者资料都会提及它,可想而知!希望大家能看了我的博客后能搞明白生命周期的概念以及在以后的代码编写中,代码往哪里去写。
照例,上笑话。。。
有的女人就是Windows虽然很优秀,但是安全隐患太大。
有的女人就是MFC她条件很好,然而不是谁都能玩的起。
有的女人就是C#长的很漂亮,但是家务活不行。
有的女人就是C++,她会默默的为你做很多的事情。
有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
有的女人就是SQL,她会为你的发展带来莫大的帮助。 感慨下,呵呵
这是Android帮助文档中的图,我先发上。帮助文档位置在例如我将SDK文件夹放在D盘,那么我的帮助文档路径为
D:\Adnroid\android-sdk-windows\docs\index.html 英文好的朋友可以参考这个帮助文档
我们主要会学习以下七个生命周期函数,活动(窗体)的生命周期函数并不止这七个,后面会说到。。耐心看
以下是对每个生命周期函数的中文解释
大家看过这些解释,对它有了一个大概的认识,那么接下来我们动手开始编写代码,来看看运行时的效果,这是代码
publicclass MainActivity extends Activity {
Button btn1;
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
System.out.println("第一个活动(窗体)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 =(Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
publicvoid onClick(View v) {
Intent intent =new Intent();
intent.setClass(MainActivity.this, ResultActivity.class);
startActivity(intent);
}
});
}
@Override
protectedvoid onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("第一个活动(窗体)初始化完毕,并将要显示时------------- onStart");
}
@Override
protectedvoid onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("第一个活动(窗体)在即将于用户交互时------------- onResume");
}
@Override
protectedvoid onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("第一个活动(窗体)在系统即将启动第二个活动时------------- onPause");
}
@Override
protectedvoid onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("第一个活动(窗体)在用户不可见时------------- onStop");
}
@Override
protectedvoid onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("第一个活动(窗体)当重新启动时------------- onRestart");
}
@Override
protectedvoid onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("第一个活动(窗体)当活动销毁时------------- onDestroy");
}
}
publicclass ResultActivity extends Activity {
TextView txtResult;
Button btn1;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
System.out.println("第二个活动(窗体)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
txtResult = (TextView)findViewById(R.id.txtResult);
txtResult.setText("第二个窗体");
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
publicvoid onClick(View v) {
Intent i =new Intent();
i.setClass(ResultActivity.this, MainActivity.class);
startActivity(i);
}
});
}
@Override
protectedvoid onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("第二个活动(窗体)初始化完毕,并将要显示时------------- onStart");
}
@Override
protectedvoid onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("第二个活动(窗体)在即将于用户交互时------------- onResume");
}
@Override
protectedvoid onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("第二个活动(窗体)在系统即将启动第二个活动时------------- onPause");
}
@Override
protectedvoid onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("第二个活动(窗体)在用户不可见时------------- onStop");
}
@Override
protectedvoid onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("第二个活动(窗体)当重新启动时------------- onRestart");
}
@Override
protectedvoid onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("第二个活动(窗体)当活动销毁时------------- onDestroy");
}
}
如果大家要创建多个活动(窗体)时,需要到AndroidManifest.xml中进行活动(窗体)的注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="TSD.Jason.Example"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<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>
<activity android:name=".ResultActivity"></activity>
</application>
</manifest>
在这里说下,如何LogCat切换到Java透视图中
在Java透视图的左下角有一个小图标,点击后 -> 其它 -> Android -> LogCat -> 确定 此时LogCat就会出现在我们的包资源管理器那里,你可以拖动它到你想要放置的地方。
由于我们在代码中使用了System.out.println 那么 我们可以在LogCat中去新建一个Filter 如何建立呢?
点击那个绿色的加号,会弹出一个窗体 ,在Filter Name 中任意输入一个名字 ,我这里叫做Sys,在By Log Tag 中输入 System.out 然后确定,此时就会创建成功,我们在程序中使用的System.out.println 就会显示在刚才建立的那个选项卡中。
大家观察,打印结果
到这里,两个窗体跳转所要执行的函数,大家应该是能够明白了。
当我们按下Home键,又该如何执行呢?
大家看图,然后再参照最开始的那七个生命周期的说明,自己动手实践下,就能明白了
当点击Back键后,其实,Android操作系统是在向活动栈中逐一销毁之前压入的活动。大家可以这样做个试验,两个窗体直接反复跳转4次,在跳转前,在编辑框中输入一些值,然后在点击Back键,看要点击几次,并看编辑框中的值。
Visible Lifetime 可视期介于调用 onStart与 onStop之间。此时Activity是可见的,但是不能响应用户事件。一个Activity在其生命周期中是有可能经历多个可视期的。在非常极端的情况下,系统也有可能终止一个处于可视期的活动,这种情况很少见。onStop方法通常用于暂时或者停止那些用来更新UI的动画,线程,定时器,服务等,所以当活动不可见的时占用的系统资源是很少的。当活动由不可见状态转化为可见状态时,在 onStart中再启动相关的线程和服务。onStart和 onStop同样也用来注册和取消注册(unregister)那些用来更新UI的广播接收者。在活动不可见时我们需要取消注册接受者(Receivers),特别是那些支持目的动作(Intent)以及更新UI的接收者。