您的位置:首页 > 其它

Activity生命周期---横竖屏切换的生命周期

2015-11-27 14:18 281 查看


先贴出一张大家众所周知activity流程图

onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
onStart():Activity在屏幕上对用户可见时调用,但还不可与用户交互
onRestart():在activity停止后,在再次启动之前被调用。

onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部,并接受用户输入。
onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
onStop():Activity被停止或者Activity变成不可见时调用
onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候

预想深刻体会生命周期,得需要在实践中慢慢记忆,写个简单的demo,log出每个周期的轨迹算是基本了解吧

先看主界面布局activity_main.xml--点击button跳转到某个activity

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.screendemo.MainActivity" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:text="跳转到下一个aty" />

</RelativeLayout>


MainActivity--主界面代码

package com.example.screendemo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
Log.e("TAG", "onAttachedToWindow");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("TAG", "onCreate");

findViewById(R.id.button).setOnClickListener(
new View.OnClickListener() {

@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,
SecondAty.class));
}
});

}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
Log.e("TAG", "onPostCreate");
}

@Override
protected void onStart() {
super.onStart();
Log.e("TAG", "onStart");
}

@Override
protected void onRestart() {
super.onRestart();
Log.e("TAG", "onRestart");
}

@Override
protected void onResume() {
super.onResume();
Log.e("TAG", "onResume");
}

@Override
protected void onPostResume() {
super.onPostResume();
Log.e("TAG", "onPostResume");
}

@Override
protected void onPause() {
super.onPause();
Log.e("TAG", "onPause");
}

@Override
protected void onStop() {
super.onStop();
Log.e("TAG", "onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.e("TAG", "onDestroy");
}

@Override
public void onBackPressed() {
super.onBackPressed();
Log.e("TAG", "onBackPressed");
}

@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
Log.e("TAG", "onDetachedFromWindow");
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e("TAG", "onRestoreInstanceState");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e("TAG", "onSaveInstanceState");
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e("TAG", "onConfigurationChanged");
}

}


SecondAty布局只有一个textView,代码直接加载布局即可---这里省略了。。。。。。


Log1、在清除缓存、杀死进程的前提下,启动项目:



Log2、启动项目后,[b]清除Log1日志,按下回退键[/b]



Log3、启动[b]项目后,[b]清除Log1日志[/b],然后回到桌面,走蓝色框---桌面启动项目,走黑色框[/b]



Log4、启动[b]项目后,[b]清除Log1日志[/b],然后长按进入任务列表界面,走蓝色框---杀掉进程,走onDestroy[/b]



Log5、启动[b]项目后,[b]清除Log1日志[/b],点击button进入某个Aty,走蓝色框,然后点击返回键回到主界面,走黑色框[/b]





Log6、启动项目后,[b]清除Log1日志,锁屏走蓝色框,开屏走黑色框[/b]



基本上项目启动,回退,回到桌面,杀死线程,跳转,锁屏,开屏都测试了,大家还是在项目中慢慢记忆把

接下来看屏幕旋转,首先要在手机设置中进行设置可以进行屏幕旋转操作

1、首先在MainActivity进行属性设置,屏幕不管如何旋转,就只支持竖屏,生命周期也不会调用

<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>


2、如果去掉 android:screenOrientation="portrait",旋转屏幕至横屏





再由横屏切换会竖屏幕时候



走的流程是一样的

3、加上这行属性 android:configChanges="orientation|keyboardHidden"在进行旋转屏幕--就是多了一个onConfigurationChanged





再由横屏切换会竖屏幕时候





走的流程是一样的

启动模式

singleTask"

检测要启动的这个Activity的affinity和当前任务的affinity是否相同,如果相同的话就会把它放入到现有任务当中,如果不同则会去创建一个新的任务。

如果现有任务当中已经存在一个该Activity的实例了,那么系统就不会再创建一次它的实例,而是会直接调用它的onNewIntent()方法

注意这里我们所说的启动Activity,都指的是启动其它应用程序中的Activity,因为"singleTask"模式在默认情况下只有启动其它程序的Activity才会创建一个新的任务

"singleInstance"

这种启动模式和"singleTask"有点相似,只不过系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。也就是说,这种Activity所在的任务中始终只会有一个Activity,通过这个Activity再打开的其它Activity也会被放入到别的任务当中。

使用Intent flags

FLAG_ACTIVITY_NEW_TASK

设置了这个flag,新启动Activity就会被放置到一个新的任务当中(与"singleTask"有点类似,但不完全一样),当然这里讨论的仍然还是启动其它程序中的Activity。这个flag的作用通常是模拟一种Launcher的行为,即列出一推可以启动的东西,但启动的每一个Activity都是在运行在自己独立的任务当中的。

FLAG_ACTIVITY_SINGLE_TOP

设置了这个flag,如果要启动的Activity在当前任务中已经存在了,并且还处于栈顶的位置,那么就不会再次创建这个Activity的实例,而是直接调用它的onNewIntent()方法。这种flag和在launchMode中指定"singleTop"模式所实现的效果是一样的。

FLAG_ACTIVITY_CLEAR_TOP

设置了这个flag,如果要启动的Activity在当前任务中已经存在了,就不会再次创建这个Activity的实例,而是会把这个Activity之上的所有Activity全部关闭掉。比如说,一个任务当中有A、B、C、D四个Activity,然后D调用了startActivity()方法来启动B,并将flag指定成FLAG_ACTIVITY_CLEAR_TOP,那么此时C和D就会被关闭掉,现在返回栈中就只剩下A和B了。

finishOnTaskLaunch

这个属性和clearTaskOnLaunch是比较类似的,不过它不是作用于整个任务上的,而是作用于单个Activity上。如果某个Activity将这个属性设置成true,那么用户一旦离开了当前任务,再次返回时这个Activity就会被清除掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: