一、Activity
1、什么是Actiity
- Activity是Android的四大组件之一。是用户操作的可视化界面;它为用户提供了一个完成操作指令的窗口。当我们创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在AndroidApp中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。
2、Activity生命周期
-
onCreate(): 当Activity第一次被创建时调用。是生命周期开始的第一个方法。在这里我们可以做一些初始化的操作,比如:调用setContentView()方法去加载界面,绑定布局里的一些控件,初始化一些Activity需要用到的数据。之后会调用onStart方法。
-
onStart():当Activity正在变为可见时调用。这个时候Activity已经可见了,但是还没有出现在前台还不能跟用户交互。可以简单理解为Actvity已经可见但是还没有出现在前台。之后会调用onResume.
-
onResume():当Activity可以跟用户交互时调用,这个时候,这个Activity位于栈的顶部。跟onStart相比,它们都是表示Activity已经可见,但是onStart调用时Activity还在后台,而调用onResume时,Activity已经进入了前台,可以跟用户交互了。之后会调用 onPause.
-
onPause():当Activity暂停时调用这个方法;在这里我们可以用来保存数据,关闭动画和其它比较耗费CPU的操作;但是在这里做的操作绝对不能耗时,因为如果当前Activity要启动一个新的Activity,这个新的Activity会在当前Activity执行完毕onPause之后才能进入可见状态。这个方法之后一般会调用的方法有onStop或者onResume.
注意:在Android3.0之前,调用这个方法之后,Activity可能会在系统内存紧张时被系统回收。
-
onStop():当Activity进入后台,并且不会被用户看到时调用。当别的Activity出现在前台时,或者Activity会被销毁时,调用此方法;在这个方法调用之后,系统可能会在内存不够的情况下回收Activity;在这个方法之后一般会调用onRestart或者onDestroy。
-
onDestroy():这个方法是Activity生命周期中调用的最后一个方法。它会在Activity被销毁之前调用;Activity销毁原因一般是我们调用Activity的finish方法手动销毁,另一个就是系统在内存紧张的情况下去销毁Activity,以用来节省空间。我们可以通过方法 isFinishing 来判断Activity是否正在被销毁。
-
onRestart():这个方法是在Activity处于停止状态后,又回到可视状态时调用。之后会调用onResume.
3.Activity启动模式
-
standard模式 默认启动模式,特点是每启动一个Activity就会在栈顶创建一个新的实例. 闹钟程序就是这个模式
-
singleTop 栈顶复用模式,首先会去先判断启动的Activity是不是位于任务栈的栈顶,如果是直接复用,否则就创建新的实例,浏览器的书签
-
singleTask 栈内复用模式保证每个Activity在整个应用程序中只有一个实例,每次启动Activity时,系统会去检查栈中是否有当前Activity的实例,如果有直接使用,并把这个Activity之上的所有实例全部出栈,如果没有这个实例就会创建一个实例, 浏览器的主页面
-
singleInsyance 模式 这个模式下的每个Activity都会启动一个新的任务栈来管理这个Activity,来电界面
4.横竖屏切换的生命周期
-
不配置configChanges属性,横竖屏切换 -> onPause() ---> onStop() ---> onDestroy() --->onCreate() ----> onStart() ----> onResume()
-
配置configChanges属性,横竖屏切换 不会执行生命周期,但会执行onConfigurationChanged()
5.异常退出的情况下如何保存Activity的状态
主要是根据两个方法来保存Activity的状态
-
onSaveInstanceState() onSaveInstanceState() 方法用来在Activity被强制销毁之前保存数据,onSaveInstanceState()方法会携带一个 Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,比如可以使用 putString()方法保存字符串,使用 putInt()方法保存整型数据。每个保存方法需要传入两个参数,第一个参数是键,第二个参数是真正要保存的内容。
-
onRestoreInstanceState() onSaveInstanceState() 方法用来取得之前在onSaveInstanceState() 保存的值。 另外,除了onRestoreInstanceState()可以取得onSaveInstanceState() 保存的值之外,onCreate()函数也可以取得保存的值,这些值就存在onCreate()函数的参数savedInstanceState里,在哪个函数取出这些值就要看具体的需求了。
二、BroadCastReciver
介绍一下BroadcastReceiver
广播(broadcast receiver):属于Android四大组件之一,是一个全局的监听器。它通常用于监听系统特定的变化,也可以监听别的Android组件的动作,它的作用主要就是监听/接收应用App或系统发出的广播消息,并做出响应。
它的注册方式有哪些
- 静态注册:清单文件注册 注册方式:在AndroidManifest.xml里通过<receiver>标签声明。
区别:静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的,也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对他起作用。
- 动态注册:代码中注册 注册方式:在代码中调用Context.registerReceiver()方法 区别:动态注册广播接收器的特点是当用来注册的Activity关闭后,广播也就失效了。
它的工作流程
1、广播接收者,通过Binder机制在AMS注册。
2、广播发送者,通过Binder机制向AMS发送广播。
3、AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者。
4、AMS将广播发送到合适的广播接收者相应的消息循环队列中。
5、广播接收者通过消息循环拿到此广播,并回调 onReceiver()。
都有哪些广播
我所知的广播有:系统广播,普通广播,有序广播,粘性广播,应用内广播。
如何定义有序广播
1.使用context.sendOrderedBroadcast()方法发送广播 2.在Androidmnifest中设置该广播的priority属性设置优先级 3.优先级高的广播可以通过setResultExtras()方法向优先级低的广播传递广播
Android系统(AMS)向一个广播接收器发送无序广播时, 并不需要等待该广播接收器返回结果,就会继续向下一个广播接收器发送广播。 因此,无序广播可近似地看作同步发送到所有的广播接收器。
但是,当Android系统发送有序广播时,将会等待前一个广播接收器返回结果后(除非处理超时), 才会继续发送向下一个广播接收器发送广播。 因此,有序广播将会按照先后顺序,依次递交给每个广播接收器
ContentProvider
介绍一下ContentProvider
- 内容提供者,是Android四大组件之一,它主要作用是以表的方式提供数据共享。自己把数据共享出去,或者是获取别的应用或者系统提供的数据,
它如何实现数据共享
- 首先自定义一个类继承 ContentProvider, 然后覆写 query、insert、update、delete 等方法. 因为其是四大组件之一因此必须在AndroidManifest文件中进行注册,并设置authorities参数,一般用包名即可,作为共享URI标识,然后设置exported属性为true允许外部访问。
它如何得到系统共享的数据
- 通过Context.getContentResolver()方法来获取到ContentResolver对象,调用ContentResolver对象的增删改查方法,传入对应的URI参数,即可对共享的数据进行操作。
URI是由哪些参数组成的
Content 用content://开头 主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 路径(path)可以用来表示我们要操作的数据,也就是我们要操作的表
网友评论