Android初级学习路线一 四大组件 之Activity

知识点:Activity生命周期、Activity启动模式  Activity的onSaveInstanceState和onRestoreInstanceState()调用

 

一 Activity生命周期 onCreate() >onStart()> onResume()> onPause()>onStop()>onDestory().

Android初级学习路线一 四大组件 之Activity_第1张图片

启动Activity:系统先调用onCreate(),然后调用onStart(),最后调用onResume()方法,activity进入运行状态。

 

注意:当activity中弹出dialog对话框的时候,activity不会回调onPause
然而当activity启动dialog风格的activity的时候,此activity会回调onPause函数

Android初级学习路线一 四大组件 之Activity_第2张图片

二 Activity 的4种启动模式

配置形式:

 

standard(标准模式):无论实例是否存在,都会重新创建新的实例

第一次进入:onCreate onStart

在栈顶再次进入: onCreate onStart

不在栈顶再次进入:onCreate onStart

按home键再次进入:onRestart onStart

按返回键:onRestart onStart

Android初级学习路线一 四大组件 之Activity_第3张图片

“应用场景:standard,平时直接创建的Activity都是这种模式的Activity,使用一般性的常用

singleTop(栈顶复用模式):若实例存在且不在栈顶,则会创建新的实例,若在栈顶,则会调用onNewIntent方法


第一次进入:onCreate onStart
在栈顶再次进入:onNewIntent
不在栈顶再次进入:onCreate onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart

应用场景:singleTop,适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容
页面

Android初级学习路线一 四大组件 之Activity_第4张图片

singleTask(栈内复用模式,具有clearTop的效果): 若实例存在,则调到栈顶,回调onNewIntent,若不存在,
先创建实例,放入栈中


第一次进入:onCreate onStart
在栈顶再次进入:onNewIntent
不在栈顶再次进入:onNewIntent onRestart onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart

应用场景:适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会
启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打
开过的页面,打开之前的页面就ok,不再新建。

Android初级学习路线一 四大组件 之Activity_第5张图片

singleInstance(单实例模式):在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一
旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多
个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。


第一次进入:onCreate onStart
在栈顶再次进入: onNewIntent
不在栈顶再次进入:onNewIntent onRestart onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart

应用场景:适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B(singleInstance) -> C,完全退出后,在此启动,首先打开的B

Android初级学习路线一 四大组件 之Activity_第6张图片

 

、onSaveInstanceState(Bundle outState)在什么时机会被调用呢? 

总结下,onSaveInstanceState(Bundle outState)会在以下情况被调用: 
1、当用户按下HOME键时。 
2、从最近应用中选择运行其他的程序时。 
3、按下电源按键(关闭屏幕显示)时。 
4、从当前activity启动一个新的activity时。 
5、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。
二、onRestoreInstanceState什么时机被调用? 
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用

private VideoView videoView;  
private static final String VIDEO_PATH = Environment  
        .getExternalStorageDirectory()  
        + File.separator  
        + "mymovie"  
        + File.separator + "shenghuaweiji.mp4";  
  
/** Called when the activity is first created. */  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  
    Log.v("tag", "onCreate");  
     
    if (videoView == null) {  
        videoView = (VideoView) this.findViewById(R.id.myvideo);  
        MediaController controller = new MediaController(this);  
        videoView.setMediaController(controller);  
        videoView.setVideoPath(VIDEO_PATH);  
        videoView.requestFocus();  
    }  
  
    if (savedInstanceState != null  
            && savedInstanceState.getInt("currentposition") != 0) {  
  
        videoView.seekTo(savedInstanceState.getInt("currentposition"));  
    }  
    videoView.start();  
  
}  

上诉代码就是保存播放进度,再onCreate时候再去取出临时状态设置到videoView。 

对于自定义View控件如果需要保存控件的状态,可以重写View的onSaveInstanceState()和onRestoreInstanceState(Parcelable state):


	@Override
	protected Parcelable onSaveInstanceState() {
		Bundle bundle = new Bundle();
		Parcelable superData = super.onSaveInstanceState();
		bundle.putParcelable("super_data", superData);
		bundle.putParcelableArrayList("save_data", mRects);
		return bundle;
	}
	
	@Override
	protected void onRestoreInstanceState(Parcelable state) {
		Bundle bundle = (Bundle) state;
		Parcelable superData = bundle.getParcelable("super_data");
		mRects = bundle.getParcelableArrayList("save_data");
		super.onRestoreInstanceState(superData);
	}

 3.横竖屏切换时Activity的生命周期

此时的生命周期跟清单文件里的配置有关系
1.不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁,当前 activity,然后重
新加载。
2.设置 Activity android:configChanges="orientation|keyboardHidden|screenSize"时,切 屏不会重新调用各个生命
周期,只会执行 onConfigurationChanged 方法去捕捉屏幕键盘变化。

总结:本人对Android初级知识点的总结,望多多提宝贵建议。

你可能感兴趣的:(android,入门学习一,四大组件,Activity启动模式,Activity生命周期)