1. 什么是Activity:
四大组件之一,通常一个用户交互界面对应一个activity。activity是Context的子类,同时实现了window.callback和keyevent.callback,可以处理与窗体用户交互的事件。
我开发中常用的有FragmentActivity、ListActivity、TabActivity(Android 4.0被Fragment取代)
2. Activity生命周期:
onCreate:当Activity第一次启动调用
onDestory:当Activity销毁的时候调用
onStart:当Activity变成可见调用
onStop:当Activity不可见调用
onResume:当Activity可以交互调用这个方法 当界面上的按钮被点击的时候调用
onPause:当Activity不可以交互调用这个方法 当界面上的按钮不可以点击
onRestart:当界面重新启动的时候调用
调用的依次顺序是:onCreate ---> onStart ---> onResume ---> onPause ---> onStop ---> onDestory,还有一个onRestart,其中onRestart是在Acitivity被onStop后,但是没有被onDestory,在再次启动此Activity时调用的(而不再调用onCreate)方法;
如果被onDestory了,则是调用onCreate方法。
点击Home键回到主界面(Activity不可见):onPause ---> onStop
当我们再次回到原Activity时: onRestart ---> onStart ---> onResume
onRestart:已经启动的activity,又从桌面回到activity时,再次启动退出当前Activity时: onPause ---> onStop ---> onDestory
3. Activity的四种状态:
running / paused / stopped / killed
- runnig:用户可以点击,activity处于栈顶状态。
- paused:activity失去焦点的时候,被一个非全屏的activity占据或者被一个透明的activity覆盖,这个状态的activity并没有销毁,它所有的状态信息和成员变量仍然存在,只是不能够被点击。(除了内存紧张的情况,这个activity有可能被回收)
- stopped:这个activity被另外一个activity完全覆盖,但是这个activity的所有状态信息和成员变量仍然存在(除了内存紧张)
- killed:这个activity已经被销毁,其所有的状态信息和成员变量已经不存在了。
- Android进程优先级:
前台 / 可见 / 服务 / 后台 / 空1. 前台进程:Foreground process
- 用户正在交互的Activity(onResume())
- 当某个Service绑定正在交互的Activity
- 被主动调用为前台Service(startForeground())
- 组件正在执行生命周期的回调(onCreate()、onStart()、onDestory())
- BroadcastReceiver正在执行onReceive()
2. 可见进程:Visible process
- 我们的Activity处在onPause()(没有进入onStop())
- 绑定到前台Activity的Service
3. 服务进程:Service process
- 简单的startService()启动。
4. 后台进程:Background process
- 对用户没有直接影响的进程 --- Activity处于onStop()的时候。
android:process=":xxx"
5. 空进程:Empty process
- 不含有任何的活动的组件。(Android设计的,处于缓存的目的,为了第二次启动更快,采取的一个权衡)
5. 两个Activity之间跳转必然会执行的是哪几个方法:
a、一般情况比如说有两个activity,分别叫A、B ,当在A里面激活B组件的时候,A 会调用 onPause()方法,然后B 调用onCreate、onStart、 OnResume,这个时候B覆盖了窗体,A会调用onStop方法. 。
b、如果B是个透明的界面,或者是对话框的样式,,就不会调用onStop方法。
6. 横竖屏切换的生命周期变化:
这个生命周期跟清单文件里的配置有关系:
a、不设置Activity的android:configChanges时,切屏会销毁当前Activity,然后重新加载,重新调用各个生命周期。onPause ---> onStop ---> onDestory ---> onCreate --->onStart ---> onResume。
b、设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"
时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。
7. Activity的四种启动模式:
清单文件中可以配置每个activity的启动模式,例如:
android:launchMode="standard"
(1) standard 标准模式:
特点:此模式不管有没有已存在的实例,都生成新的实例。每次调用startActivity()启动Activity时都会创建一个新的Activity放在栈顶,每次返回都会销毁实例并出栈,可以重复创建。
(2) singleTop 单一顶部模式:
特点:会检查任务栈栈顶的Activity,如果发现栈顶已经存在实例,就不会创建新的实例,直接复用。但如果不在栈顶,那么还是会创建新的实例。
应用场景:浏览器书签的页面,流氓的网站,避免创建过多的书签页面
(3) singleTask 单一任务模式:
特点:这种模式不会检查任务栈的栈顶,检查当前任务栈,如果发现有实例存在,直接复用。任务栈中只有一个实例存储(把当前activity上面的所有的其它activity都清空,复用这个已经存在的activity)
应用场景:浏览器浏览页面的Activity,播放器播放的activity。
(4) singleinstance 单一实例模式
特点:系统会为这个Activity单独创建一个任务栈,这个任务栈里面只有一个实例存在并且保证不再有其它activity实例进入。
应用场景:来电页面。
8. scheme跳转协议:
Android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉app跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
关于scheme跳转协议,可以查看下面的博客,站在巨人的肩膀上,才能看得更远
Android产品研发(十一)-->应用内跳转Scheme协议
9. 如果后台的activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态:
除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性就越大。
一般来说,调用 onPause()和 onStop()方法后的 activity 实例仍然存在于内存中,activity 的所有信息和状态数据不会消失,当 activity 重新回到前台之后,所有的改变都会得到保留。但是当系统内存不足时, 调用onPause()和onStop()方法后的 activity可能会被系统摧毁,,此时内存中就不会存有该 activity 的实例对象了。如果之后这个 activity 重新回到前台,之前所作的改变就会消失。
为了避免此种情况,我们可以覆写onSaveInstanceState()
方法。onSaveInstanceState()方法接受一个 Bundle 类型的参数,开发者可以将状态数据存储到这个 Bundle 对象中,这样即使 activity 被系统摧毁,当用户重新启动这个 activity 而调用它的onCreate()方法时,上述的 Bundle 对象会作为实参传递给 onCreate()方法,开发者可以从 Bundle 对象中取出保存的数据,然后利用这些数据将 activity 恢复到被摧毁之前的状态。
但是有些情况用上面这种方式是解决不了的,比如说我们正在播放一个视频,结果手机突然没电了,我们想在手机充电之后,还能返回到我们之前播放的位置,就可以仿照WPS等软件的保存机制,可以在播放视频的时候,每隔一段时间保存当前进度到一个文件中(不能是内存),这样即使没电了,但是我们之前的某个时间有保存当前进度,所以仍然能够回到之前播放的位置。
喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!