Android 深入学习Activity(生命周期详解)

一、Activity生命周期

Android 深入学习Activity(生命周期详解)_第1张图片
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方法来销毁它。


流程图

Android 深入学习Activity(生命周期详解)_第2张图片

三、Activity横竖屏切换


Activity横竖屏切换时并不是直接实现了横屏效果,而是先销毁了原来的Activity,然后调用OnCreate、OnStart、OnResume方法来呈现一个新的Activity。

因为Activity在横竖屏切换时会重新创建Activity这样会使原本的Activity的进度发生改变(例如播放器),所以有些情况下我们需要通过OnSaveInstanceState(Bundle outState)这个方法来保存一些数据。

具体使用方法

在OnSaveInstanceState(Bundle outState)方法中保存数据,面以String为例。

[java]  view plain  copy
  1. @Override  
  2. public void onSaveInstanceState(Bundle outState)  
  3. {  
  4.         //一般用于保存当前状态信息  
  5.     super.OnSaveInstanceState(outState);  
  6.     outState.putString("key","value");  
  7. }  
  8.   
  9. //我们看到OnCreate方法中有一个参数就是Bundle savedInstanceState  
  10. //所以我们在OnCreate中来获取保存数据.  
  11. if(savedInstanceState!=null)  
  12. {  
  13.    String str = savedInstanceState.getString("key");  
  14. }  
注意:OnSaveInstanceState方法是在OnPause方法执行以后才开始执行的。

四、Activity的启动方式


一、 直接启动

1.方法一

[java]  view plain  copy
  1. Intent intent = new Intent(MainActivity.this,SecondActivity.class);  
  2. StartActivity(intent);  
2.方法二

[java]  view plain  copy
  1. Intent intent = new Intent();  
  2. ComponentName component = new ComponentName( MainActivity.this,SecondActivity.class);  
  3. intent.setComponent(component);  
  4. startActivity(intent);  


二、 匿名启动

首先在Mainifest.xml文件中进行注册

[html]  view plain  copy
  1. <activity android:name=".SecondActivity">  
  2.     <intent-filter>  
  3.         <action android:name="test"/>  
  4.         <category android:name="android.intent.category.DEFAULT"/>  
  5.     intent-filter>  
  6. activity>  
然后在代码中调用

[java]  view plain  copy
  1. Intent intent = new Intent();  
  2. intent.setAction("test");  
  3. startActivity(intent);  
使用于Activity的class文件不是来自于代码,而是来自于第三方文件时。或者启动一个系统Activity时使用(系统Activity我们不用在Mainifest.xml中进行注册)。
注意:如果启动系统Activity需要设置一个Uri。

[java]  view plain  copy
  1. Intent intent = new Intent();  
  2. intent.setAction(Intent.ACTION_VIEW);  
  3. Uri uri = Uri.parse("http://www.baidu.com");  
  4. intent.setData(uri);  
  5. startActivity(intent);  

五、Activity之间的数据交换

一、跳转时传递数据

(1)方法一

[java]  view plain  copy
  1. Intent intent = new Intent(MainActivity.this,SecondActivity.class);  
  2. intent.putExtra("name","db");//以键值对的方式传递  
  3. StartActivity(intent);  
  4. 在SecondActivity的代码中获取数据  
  5. Intent intent = getIntent();  
  6. if(intent!=null)  
  7. {  
  8.     String name = intent.getStringExtra("name");  
  9. }  
(2)方法二
[java]  view plain  copy
  1. Intent intent = new Intent(MainActivity.this,SecondActivity.class);  
  2. Bundle bundle = new Bundle();  
  3. bundle.putString("name","db");  
  4. intent.putExtras(bundle);  
  5. StartActivity(intent);  
  6. //在SecondActivity的代码中获取数据和方法一相同  
(3)当传递的类型比较多的时候,我们可以通过java类来传递

[java]  view plain  copy
  1. public class User implements Serializable{  
  2.     private String name;  
  3.     private int age;  
  4.     public User(String name,int age)  
  5.     {  
  6.         this.name = name;  
  7.         this.age = age;  
  8.     }  
  9. }  
  10. Intent intent = new Intent(MainActivity.this,SecondActivity.class);  
  11. User user = new User("db",20);  
  12. Bundle bundle = new Bundle();  
  13. bundle.putSerializable("User",user);  
  14. intent.putExtras(bundle);  
  15. StartActivity(intent);  
在SecondActivity的代码中获取数据
[java]  view plain  copy
  1. Intent intent = getIntent();  
  2. if(intent!=null)  
  3. {  
  4.     User user = (User)intent.getSerializableExtra("User");  
  5. }  
注意:Bundle传递数据时数据大小必须小于1M否则会抛出TransactionTooLargeException异常。

二、回传数据

这样我们需要一个回调方法来实现,当activity退出时,向上一个activity传递数据(MainActivity获取SecondActivity返回的数据)。

设置数据

[java]  view plain  copy
  1. Intent intent = new Intent();  
  2. Bundle bundle = new Bundle();  
  3. bundle.putString("name","db");  
  4. intent.putExtras(bundle);  
  5. SecondActivity.this.setResult(-1,intent);  
获取数据(系统提供了一个回调方法)
[java]  view plain  copy
  1. //接收选择器选中的结果:放在需要接受数据的activity中  
  2.     @Override  
  3.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  4.         super.onActivityResult(requestCode, resultCode, data);  
  5.         //在这里用switch判断requestCode或者resultCode的值  
  6.     //然后通过Bundle取出数据  
  7.     Bundle bundle = data.getExtras();  
  8.     String name = bundle.getString("name");  
  9.         }  
  10.     }  

当我们需要回传数据时就不能使用startActivity(intent)来开启Activity了,需要使用startActivityForResult(intent,requestCode);//requestCode的值随意给不能重复。

六、Activity的启动模式


Activity的启动模式共四种:standard、singleTop、singleTask、singleInstance

设置启动模式(在Manifest的activity中添加以下代码)

[java]  view plain  copy
  1. android: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(生命周期详解)_第3张图片




你可能感兴趣的:(Android)