




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android生命周期的理解生命周期图:生命周期有7个函数protected void onCreate(Bundle savedInstanceState);protected void onStart();protected void onResume();protected void onPause();protected void onStop();protected void onRestart();protected void onDestroy();onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!onStart():activity变为在屏幕上对用户可见时调用。onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。onDestroy():activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源!以上七个方法分别在四个阶段按照一定顺序调用:1. 开始Activity:这个阶段依次执行3个生命周期方法onCreate(),onStart(),onResume().2. Activity失去焦点:就是在用户不能对该Activity操作的时候,我们理解为失去了焦点。比如在Activity获得焦点的情况下进入第二个Activity,当前的Activity将失去焦点。在这一阶段会依次调用onPause(),onStop()3. Activity重新获得焦点:onRestart(),onStart(),onResume()4. 关闭Activity:onPause(),onStop(),onDestroy在执行这4个阶段的过程中,可以改变系统执行轨迹的生命周期方法是onPause()和onStop().如果执行onPause()方法过程中,Activity重新获得了焦点,则不会执行onStop().而是这样执行:onPause(),onResume(),onPause.下面是两个例子第一个Activity:package com.sunny.android_cycle;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class Android_cycleActivity extends Activity private Button btn;private TextView tv01; /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); tv01=(TextView) findViewById(R.id.tv01); tv01.setText(this+);/打印activity的ID System.out.println(first oncreate); btn=(Button) findViewById(R.id.btn1); btn.setOnClickListener(new ClickEvent(); class ClickEvent implements OnClickListenerpublic void onClick(View v) Intent intent = new Intent();intent.setClass(Android_cycleActivity.this, secondActivity.class);Android_cycleActivity.this.startActivity(intent);/finish(); Overrideprotected void onStart() / TODO Auto-generated method stubSystem.out.println(first onStart);super.onStart();Overrideprotected void onRestart() System.out.println(first onRestart);/ TODO Auto-generated method stubsuper.onRestart();Overrideprotected void onResume() System.out.println(first onResume);/ TODO Auto-generated method stubsuper.onResume();Overrideprotected void onPause() System.out.println(first onPause);/ TODO Auto-generated method stubsuper.onPause();Overrideprotected void onStop() System.out.println(first onStop);/ TODO Auto-generated method stubsuper.onStop();Overrideprotected void onDestroy() System.out.println(first onDestroy);/ TODO Auto-generated method stubsuper.onDestroy();第二个Activity:package com.sunny.android_cycle;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/* * author sunny * */public class secondActivity extends Activity private Button btn2;/* (non-Javadoc) * see android.app.Activity#onCreate(android.os.Bundle) */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.second);System.out.println(second onCreate);btn2=(Button) findViewById(R.id.btn02);btn2.setOnClickListener(new ClickEvent();class ClickEvent implements OnClickListenerpublic void onClick(View v) Intent intent = new Intent();intent.setClass(secondActivity.this, Android_cycleActivity.class);secondActivity.this.startActivity(intent);Overrideprotected void onStart() System.out.println(second onStart);super.onStart();Overrideprotected void onRestart() System.out.println(second onRestart);super.onRestart();Overrideprotected void onResume() System.out.println(second onResume);super.onResume();Overrideprotected void onPause() System.out.println(second onPause);super.onPause();Overrideprotected void onStop() System.out.println(second onStop);super.onStop();Overrideprotected void onDestroy() System.out.println(second onDestroy);super.onDestroy();加载第一个Activity,后台的打印:这个不用多说,我们可以看到这个Activity,并且得到了焦点。此时在界面上可以看到Activity的ID值:Android_cycleActivity 44ee2f00下来点击第一个Activity的按钮,跳转到第二个Activity:后台输出:第一个Activity被暂停,另一个Activity执行了第一个阶段。第一个Activity失去了焦点,不能再被看见,这时调用了第一个activity的onStop().然后我们按手机上的回退键,回到第一个界面可以发现,界面上的Activity的ID值是不变的!后台的输出:这时第二个activity暂停,开始失去焦点,而第一个activity开始重新获得焦点,开始onRestart,onStart,onResume,第二个activity不再可见,调用onStop-onDestroy。下面我们在考虑,这次从第二个activity跳转回来,我们点击第二个界面的跳回键。此时,注意,界面上的activity的值已经改变了!后台输出:第一个界面并没有和刚才那样从onStoponRestartonStartonResume而是执行了onStoponCreateonStartonResume.这样我们很容易理解了,为什么第一个Activity的ID值变化了。下面再看另一个例子,这个例子和第一个雷同,不同的是第二个Activity的形式是对话框的形式,就是并没有完全挡住第一个Activity,那么,我们可以猜测第一个Activity的onStop方法调用时机和前面一个例子可能有点不同。第一个Activity的java代码import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class FirstActivity extends Activity /* Called when the activity is first created. */private Button myButton;private TextView tv01;Overridepublic void onCreate(Bundle savedInstanceState) System.out.println(FirstActivity - onCreate );super.onCreate(savedInstanceState);setContentView(R.layout.main);tv01=(TextView) findViewById(R.id.textview01);tv01.setText(this+);myButton = (Button) findViewById(R.id.myButton);myButton.setOnClickListener(new ButtonListener();protected void onDestroy() / TODO Auto-generated method stubSystem.out.println(FirstAcvity -onDestory);super.onDestroy();protected void onPause() / TODO Auto-generated method stubSystem.out.println(FirstAcvity -onPause);super.onPause();protected void onRestart() / TODO Auto-generated method stubSystem.out.println(FirstAcvity -onRestart);super.onRestart();Overrideprotected void onResume() / TODO Auto-generated method stubSystem.out.println(FirstAcvity -onResume);super.onResume();Overrideprotected void onStart() / TODO Auto-generated method stubSystem.out.println(FirstAcvity -onStart);super.onStart();Overrideprotected void onStop() / TODO Auto-generated method stubSystem.out.println(FirstAcvity -onStop);super.onStop();class ButtonListener implements OnClickListener public void onClick(View v) / TODO Auto-generated method stubIntent intent = new Intent();intent.setClass(FirstActivity.this, SecondActivity.class);FirstActivity.this.startActivity(intent);第二个Activity的java代码import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class SecondActivity extends Activityprivate Button secondButton;Overrideprotected void onCreate(Bundle savedInstanceState) System.out.println(SecondActivity-onCreate);/ TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.second);secondButton = (Button)findViewById(R.id.secondButton);secondButton.setOnClickListener(new ButtonListener();Overrideprotected void onDestroy() / TODO Auto-generated method stubSystem.out.println(SecondActivity-onDestory);super.onDestroy();protected void onPause() / TODO Auto-generated method stubSystem.out.println(SecondActivity-onPause);super.onPause();Overrideprotected void onRestart() / TODO Auto-generated method stubSystem.out.println(SecondActivity-onRestart);super.onRestart();Overrideprotected void onResume() / TODO Auto-generated method stubSystem.out.println(SecondActivity-onResume);super.onResume();protected void onStart() / TODO Auto-generated method stubSystem.out.println(SecondActivity-onStart);super.onStart();Overrideprotected void onStop() / TODO Auto-generated method stubSystem.out.println(SecondActivity-onStop);super.onStop();class ButtonListener implements OnClickListenerpublic void onClick(View v) / TODO Auto-generated method stubIntent intent = new Intent();intent.setClass(SecondActivity.this, FirstActivity.class);SecondActivity.this.startActivity(intent);第二个Activity是对话框的风格的,这个只要在AndroidManifest.xml中对第二个Activity进行如下注册onResumeonPause,所以,我们得到了FirstActivity-onResume,这样的输出。再考虑下,如果我们不是点击手机上回退键回到第一个Activity,而是点击跳回按钮返回第一个activity,我们可以大胆的说,ID值肯定不同了,第一个activity应该是onpauseonStoponCreateonStartonStartonResume所以我们可以了解到onPause(),当第一个Activity使用Intent跳到第二个Activity,将先调用第一个Activity的onPause(),然后是第二个Activity的onCreate,onStart,onResume.如果第二个Activity挡住了第一个Activity,那么将下面调用的是第一个Activity的onStop();这样以后第一个Activity的生命周期只有走onStop了;但是如果第二个Activity没有挡住第一个Activity,那么不会调用onStop()。最后我们可以查阅API文档,可以看到当调用onPause,onStop,onDestroy,都有可能杀死Activity。这个由系统决定,onPause排在第一个,也就是说Activity在失去焦点的时候就有可能被终止进程,这样onStop和onDestroy将不会调用。因此,我们应该在onPause方法中保存当前的Activity状态,就是前面说的保护现场啦。以上所述,Activity的加载模式,在Mainifest.xml,Activity节点 :android:launchMode=”stander” 这个模式是默认的。Android:launchMode 有四个值,stander,singleTop,singleTask,singleInstance区分Activity的四种加载模式在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。加载模式分类及在哪里配置Activity有四种加载模式: standard singleTop singleTask singleInstance设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:也可以在Eclipse ADT中图形界面中编辑:区分Activity的加载模式,通过示例一目了然。这里编写了一个Activity A(ActA)和Activity B(ActB)循环跳转的例子。对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。standard首先说standard模式,也就是默认模式,不需要配置launchMode。先只写一个名为ActA的Activity:package com.easymorse.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class ActA extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(this + ); Button button = new Button(this); button.setText(go actA); button.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent = new Intent(); intent.setClass(ActA.this, ActA.class); startActivity(intent); ); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); 例子中都没有用layout,免得看着罗嗦。可见是ActA ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。第一个界面:点击按钮后:可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的,intent将发送给新的实例。现在点Android设备的回退键,可以看到是按照刚才创建Activity实例的倒序依次出现,类似退栈的操作,而刚才操作跳转按钮的过程是压栈的操作。如下图:singleTopsingleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。还是用刚才的示例,只需将launchMode改为singleTop,就能看到区别。运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例。如果回退,将退出应用。singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。如果是A Activity跳转到B Activity,再跳转到A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A Activity的新实例,因为当时的栈顶不是A Activity实例。ActA类稍作改动:package com.easymorse.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class ActA extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(this + ); Button button = new Button(this); button.setText(go actB); button.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent = new Intent(); intent.setClass(ActA.this, ActB.class); startActivity(intent); ); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); ActB类:package com.easymorse.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;public class ActB extends Activity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); Button button=new Button(this); button.setText(go actA); button.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent=new Intent(); intent.setClass(ActB.this, ActA.class); startActivity(intent); ); LinearLayout layout=new LinearLayout(this); layout.addView(button); this.setContentView(layout); ActB类使用默认(standard)加载,ActA使用singleTop加载。结果类似下图:如果把ActA的加载模式改为standard,情况一样。singleTasksingleTask模式和后面的singleInstance模式都是只创建一个实例的。当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。把上面singleTop的实例中的ActA的launchMode改为singleTask,ActB的改为standard。那么会发现在ActA界面中按一次按钮:然后在ActB1界面中按按钮,因为ActA是singleTask,会使用原来的ActA1实例。这时候栈内的情况:如果多次按按钮跳转,会发现始终只有ActA1这一个ActA类的实例。singleInstance解释singleInstance模式比较麻烦。首先要说一下Task(任务)的概念。如果是Swing或者Windows程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口。注
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论