Android 深入学习Activity(生命周期详解)
2018-02-26 11:18
441 查看
一、Activity生命周期
OnCreate 创建Activity时调用 销毁以前只执行一次
OnStart 打开Activity时调用
OnResume 唤醒Activity时调用
OnPaused 暂停Activity时调用
OnStopped 停止Activity时调用
OnDestroy 销毁Activity时调用
在Application中可以监听所有Activity的生命周期
二、Activity的交互
当第一个Activity跳转到第二个Activity时,首先执行的是第一个Activity的OnPaused方法,然后执行第二个Activity的OnCreate、OnStart、OnResumed方法,等到第二个Activity完全加载完毕(可显示状态)以后才会执行第一个Activity的Onstopped方法,当然跳转过程不会使第一个Activity被销毁。当从第二个Activity返回到第一个Activity时,首先执行的是第二个Activity的OnPaused方法,然后调用第一个Activity的OnRestart方法、OnStart方法、OnResumed方法,最后第一个Activity已经加载完毕(可显示状态),调用第二个Activity的OnStopped、OnDestroy方法来销毁它。
流程图
三、Activity横竖屏切换
Activity横竖屏切换时并不是直接实现了横屏效果,而是先销毁了原来的Activity,然后调用OnCreate、OnStart、OnResume方法来呈现一个新的Activity。因为Activity在横竖屏切换时会重新创建Activity这样会使原本的Activity的进度发生改变(例如播放器),所以有些情况下我们需要通过OnSaveInstanceState(Bundle outState)这个方法来保存一些数据。
具体使用方法在OnSaveInstanceState(Bundle outState)方法中保存数据,面以String为例。
[java] view plain copy@Override
public void onSaveInstanceState(Bundle outState)
{
//一般用于保存当前状态信息
super.OnSaveInsta
4000
nceState(outState);
outState.putString("key","value");
}
//我们看到OnCreate方法中有一个参数就是Bundle savedInstanceState
//所以我们在OnCreate中来获取保存数据.
if(savedInstanceState!=null)
{
String str = savedInstanceState.getString("key");
}
注意:OnSaveInstanceState方法是在OnPause方法执行以后才开始执行的。
四、Activity的启动方式
一、 直接启动
1.方法一[java] view plain copyIntent intent = new Intent(MainActivity.this,SecondActivity.class);StartActivity(intent);
2.方法二[java] view plain copyIntent intent = new Intent();
ComponentName component = new ComponentName( MainActivity.this,SecondActivity.class);
intent.setComponent(component);
startActivity(intent);
二、 匿名启动
首先在Mainifest.xml文件中进行注册[html] view plain copy<activity android:name=".SecondActivity"><intent-filter>
<action android:name="test"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
然后在代码中调用[java] view plain copyIntent intent = new Intent();
intent.setAction("test");
startActivity(intent);
使用于Activity的class文件不是来自于代码,而是来自于第三方文件时。或者启动一个系统Activity时使用(系统Activity我们不用在Mainifest.xml中进行注册)。
注意:如果启动系统Activity需要设置一个Uri。[java] view plain copyIntent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.parse("http://www.baidu.com");
intent.setData(uri);
startActivity(intent);
五、Activity之间的数据交换
一、跳转时传递数据
(1)方法一[java] view plain copyIntent intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("name","db");//以键值对的方式传递
StartActivity(intent);
在SecondActivity的代码中获取数据
Intent intent = getIntent();
if(intent!=null)
{
String name = intent.getStringExtra("name");
}
(2)方法二
[java] view plain copyIntent intent = new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name","db");
intent.putExtras(bundle);
StartActivity(intent);
//在SecondActivity的代码中获取数据和方法一相同
(3)当传递的类型比较多的时候,我们可以通过java类来传递
[java] view plain copypublic class User implements Serializable{
private String name;
private int age;
public User(String name,int age)
{
this.name = name;
this.age = age;
}
}
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
User user = new User("db",20);
Bundle bundle = new Bundle();
bundle.putSerializable("User",user);
intent.putExtras(bundle);
StartActivity(intent);
在SecondActivity的代码中获取数据
[java] view plain copyIntent intent = getIntent();
if(intent!=null)
{
User user = (User)intent.getSerializableExtra("User");
}
注意:Bundle传递数据时数据大小必须小于1M否则会抛出TransactionTooLargeException异常。
二、回传数据
这样我们需要一个回调方法来实现,当activity退出时,向上一个activity传递数据(MainActivity获取SecondActivity返回的数据)。设置数据[java] view plain copyIntent intent = new Intent();Bundle bundle = new Bundle();
bundle.putString("name","db");
intent.putExtras(bundle);
SecondActivity.this.setResult(-1,intent);
获取数据(系统提供了一个回调方法)[java] view plain copy//接收选择器选中的结果:放在需要接受数据的activity中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//在这里用switch判断requestCode或者resultCode的值
//然后通过Bundle取出数据
Bundle bundle = data.getExtras();
String name = bundle.getString("name");
}
}
当我们需要回传数据时就不能使用startActivity(intent)来开启Activity了,需要使用startActivityForResult(intent,requestCode);//requestCode的值随意给不能重复。
六、Activity的启动模式
Activity的启动模式共四种:standard、singleTop、singleTask、singleInstance设置启动模式(在Manifest的activity中添加以下代码)[java] view plain copyandroid:launchMode="singleTask"standard(标准模式)是系统的默认模式(可以不指定)。
singleTop(单栈顶模式)如果存在A-B-C三个Activity,启动D,则D会被创建形成A-B-C-D;如果是A-B-C-D,D是栈顶的情况下,再次启动D,则D不会被创建。
singleTask(单例模式)如果不存在D(Activity)则创建D,否则把D调到栈顶(不重新创建)。
singleInstance 与singleTask相似,不会重复创建Activity,但是该模式下创建Activity会被放到一个新的Task中。
相关文章推荐
- Android 深入学习Activity(生命周期详解)
- 深入剖析Android四大组件(一)——Activity生命周期详解
- Android:Activity——生命周期深入详解
- 【Android学习总结】之Activity:深入理解、体验Activity的生命周期
- android activity详解二:Activity的生命周期
- android activity详解二:Activity的生命周期
- Android学习12--深入理解Activity
- Android学习之横竖屏切换与Activity生命周期的关系
- Android学习之Activity生命周期
- 【Android Training - 01】详解Activity生命周期 [ Lesson 1 - 启动与销毁Activity ]
- Android 学习记录3 -Activity 的生命周期
- Android中的Activity生命周期学习
- Android 学习记录3 -Activity 的生命周期
- 【Android Training - 01】详解Activity生命周期 [ Lesson 2 - 暂停与恢复Activity ]
- android activity详解二:Activity的生命周期
- 深入理解 Android Activity的生命周期
- 【Based Android】详解android中activity的完整生命周期
- Android 程式开发:(一)详解Activity —— 1.1生命周期(前言)
- 【Android笔记 八】详解android中activity的完整生命周期
- 【Android Training - 01】详解Activity生命周期 [ Lesson 0 - 章节概览 ]