Android笔记——Activity生命周期与数据传递
2016-03-21 12:26
399 查看
1.概述
四大组件之一,用于表示界面,与用户交互
涉及到的概念:Application、 Activity、 Activity栈 、Task
2.状态与生命周期
2.1 三个基本状态:
1)resumed 一个新activity启动入栈,它在屏幕最前端,处于栈的最顶端,此时它处于与用户交互的激活状态
2)paused 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它依然可见,但它已经失去了焦点故不可与用户交互
3)stoped 当Activity被另一个Activity覆盖,失去焦点并不可见时即处于stoped状态
2.2 生命周期
3.状态数据暂存
3.1 onPause()
当系统要启动另一个activity时调用(其他的activity显示之前),这个方法通常被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快,不然可能会出现ANR。
3.2 onSaveInstanceState()
它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(), 所以它们两个都可以恢复捕获的状态。(意思是onRestoreInstanceState只有在Activity被系统回收后再重新生成时才会被调用)
onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,
eg:
用户按下HOME键时。
长按HOME键,选择运行其他的程序时。
按下电源按键(关闭屏幕显示)时。
从activity A中启动一个新的activity B时。
屏幕方向切换时,例如从竖屏切换到横屏时。
4.数据传递
不同Activity之间的数据传递,一般使用intent作为“信使”,一个intent对象一般由两部分构成,一是“目的地”,二是消息内容,“目的地”时必须的,内容是可选的。
发送方:
接收方
5.结果返回处理
Activity提供了一种机制,跳转到其他Activity再返回时,可以接收其他Activity返回的值,而无需再start新的当前Activity,eg:
创建两个Activity,在MainActivity中输入数据后单击“下一步”按钮,启动OtherActivity,在OtherActivity收集到数据后,点击“上一步”,回到MainActivity,并传回OtherActivity的数据,覆盖MainActivity的原数据
MainActivity
OtherActivity
四大组件之一,用于表示界面,与用户交互
涉及到的概念:Application、 Activity、 Activity栈 、Task
2.状态与生命周期
2.1 三个基本状态:
1)resumed 一个新activity启动入栈,它在屏幕最前端,处于栈的最顶端,此时它处于与用户交互的激活状态
2)paused 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它依然可见,但它已经失去了焦点故不可与用户交互
3)stoped 当Activity被另一个Activity覆盖,失去焦点并不可见时即处于stoped状态
2.2 生命周期
//Activity创建时调用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //Activity可见时调用 @Override protected void onStart() { super.onStart(); } //Activity重新可见时调用 @Override protected void onRestart() { super.onRestart(); } //Activity获得焦点时调用 @Override protected void onResume() { super.onResume(); } //Activity失去焦点但仍然可见时调用(在其他应用需要内存时,可能会被kill) @Override protected void onPause() { super.onPause(); } //Activity 完全不可见时调用(会被系统kill) @Override protected void onStop() { super.onStop(); } //Activity被销毁时调用(会被系统kill) @Override protected void onDestroy() { super.onDestroy();
3.状态数据暂存
3.1 onPause()
当系统要启动另一个activity时调用(其他的activity显示之前),这个方法通常被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快,不然可能会出现ANR。
3.2 onSaveInstanceState()
它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(), 所以它们两个都可以恢复捕获的状态。(意思是onRestoreInstanceState只有在Activity被系统回收后再重新生成时才会被调用)
onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,
eg:
用户按下HOME键时。
长按HOME键,选择运行其他的程序时。
按下电源按键(关闭屏幕显示)时。
从activity A中启动一个新的activity B时。
屏幕方向切换时,例如从竖屏切换到横屏时。
// Activity即将移出栈顶保留UI状态时调用此方法 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.d("***", "onSaveInstanceState"); } // onCreate完成后被调用,用来恢复UI状态 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.d("***", "onRestoreInstanceState"); }
4.数据传递
不同Activity之间的数据传递,一般使用intent作为“信使”,一个intent对象一般由两部分构成,一是“目的地”,二是消息内容,“目的地”时必须的,内容是可选的。
发送方:
//创建信使(已加入“地址”) Intent intent=new Intent(CurrentActivity.this,OtherActivity.class); //创建消息内容 Bundle bundle=new Bundle(); bundle.putBoolean("Booleankey",true); bundle.putString("Stringkey","value"); bundle.putSerializable("person", new Person()); intent.putExtra("key",bundle); /** //也可以不用Bundle这个中介,直接把信息写在intent中 intent.putExtra("Booleankey",true); intent.putExtra("Stringkey", "value"); intent.putExtra("person", new Person()); **/ //跳转至目的地Activity startActivity(intent);
接收方
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); Intent intent=getIntent(); Bundle bundle=intent.getBundleExtra("key"); String Stringkey=bundle.getString("Stringkey"); Boolean Booleankey=bundle.getBoolean("Booleankey"); Person person=bundle.getSerializable("person"); /** //如果信息直接搭载在Intent上 String Stringkey=intent.getStringExtra("Stringkey"); Boolean Booleankey=intent.getBooleanExtra("Booleankey", true); Person person=intent.getSerializableExtra("person"); **/ }
5.结果返回处理
Activity提供了一种机制,跳转到其他Activity再返回时,可以接收其他Activity返回的值,而无需再start新的当前Activity,eg:
创建两个Activity,在MainActivity中输入数据后单击“下一步”按钮,启动OtherActivity,在OtherActivity收集到数据后,点击“上一步”,回到MainActivity,并传回OtherActivity的数据,覆盖MainActivity的原数据
MainActivity
//跳转页面 Intent intent=new Intent(MainActivity.this,OtherActivity.class); //后一个参数为requestCode,用于处理返回结果时判断是从哪个界面返回的 StartActivityForResult(intent,0); //处理返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==0&&resultCode==RESULT_OK){ //处理从Intent data接收的数据 } }
OtherActivity
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); //准备要回传的数据 Intent resultIntent=getIntent(); resultIntent.putExtra("Stringkey", "value"); setResult(RESULT_OK,resultIntent); //结束当前Activity this.finish(); }
相关文章推荐
- 编译vlc android arm64-v8a
- Span 介绍及使用(二)
- Span 介绍及使用(一)
- Android基于Facebook Rebound的动画效果框架Backboard demo (非常炫酷)
- Android静默安装和静默卸载
- Android实现音乐示波器、均衡器、重低音和音场功能
- android:process 讲解
- Android性能测试:CPU内存监控工具APT
- Android 引导页动态加载(多页面 ViewPager联动RadioButton)
- AndroidStudio权威教程 AS添加第三方库的6种方式(Jar module so等)
- Android 打开地图并显示指定的经纬度
- Android开发:使用Glide动态加载圆形图片和圆角图片
- Android更改桌面应用程序launcher的两种方式
- Android TextView特殊效果
- Android性能优化方法和内存泄露
- Android Studio 单元测试
- Android Studio使用指南(3)
- 关于android中的百分比适配
- 6款最好的android模拟器
- Android ListView中item之间的分割线