(一)Android基础知识点
1、四大组件是什么
Activity,Service,ContentProvider,BroadcastReceiver
2、四大组件的生命周期和简单用法
Activity的生命周期:onCreate()->onStart()->onResume()->onPause()->onStop()->onRestart()->onDestroy()
用法:创建一个Intent对象,将该Activity以及将要打开的Activity传进去,然后Intent对象将代入startActivity()即可启动
Service的生命周期:
(1)onCreate()->onStart()->onDestroy()
(2)onCreate()->onBind()->onUnBind()->onRebind()->onDestroy()
用法:
(1)通过简单的startService()进行service启动,此后启动该Service的组件无法把控Service的生命周期,理论上此后该Service可以在后台无期限运行,但根据实际情况该Service可能会在任意一个时刻被杀死
我们可以在onStartCommand()里面做我们要做的操作,虽然运行ANR(Application No Response) 时间比Activity多了近一倍,但Service跟Activity一样不可以做耗时操作
(2)通过绑定的方式启动Service
绑定后,该Service与启动绑定操作的组件形成绑定,当组件销毁时,该Service也随着销毁
ContentProvider:
提供数据的进程使用contentProvider内容提供者
获取数据的进程使用contentResolver内容解析器
BroadcastReceive广播接收器生命周期:
生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR程序无响应的错误信息
它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束
用法:
(1)静态注册(常驻广播)
在AndroidManifest.xml中进行注册,App启动的时候自动注册到系统中,不受任何组件生命周期影响,(即便应用程序已经关闭),但是耗电,占内存
(2)动态注册(非常驻广播)
在代码中进行注册,通过IntentFilter意图过滤器筛选需要监听的广播,记得注销(推荐在onResume()注册,在onPause()注销),使用灵活,生命周期随组件变化
3、Activity之间的通信方式
(1)在Intent跳转时携带数据
使用Bundle传值对比在Intent里直接赋值的好处:
(2)借助类的静态变量来实现
由于类的静态成员可以通过“className.fileName”来访问,故而可以供两个Activity访问从而实现Activity之间的数据通信
(3)借助全局变量 Application 来实现
和类的静态变量类似,但是这个类作为单独第三个类(最好是写一个Application类)
(4)借助Service服务
Service设计的本意,就是提供一些后台的服务,数据存取,也可以归于其职责的一部分
Service是提供了直连机制,调用的Activity,可以通过bindService方法,与目标Service建立一条数据通路,拿到IBinder。这样,通过Android提供的IPC模型(进程间通信),就可以进行远程方法的调用和数据的传输了
通过这种模式,可以解决一定问题,但是对于Service来说,实在是太大才小用了,Service的专长,不是在数据,还是在逻辑。对于传数据而言,Service还是重量了一点,不但是有连接耗精力,传输经由IPC,写起来也够费劲。而且作为组件,Service随时可能死掉,你还是要费劲心机的处理数据的持久化,得不偿失
(5)借助外部存储来实现通讯
Ⅰ.借助 SharedPreference来实现
SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了string,set,int,long,float,boolean六种数据类型。最终数据是以xml形式进行存储。在应用中通常做一些简单数据的持久化缓存
Ⅱ.借助 SQLite 来实现
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用,比前面学过的只适用于存储简单数据的两种存储方式要好很多
Ⅲ.借助 Flie 来实现
文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供openFileInput()和openFileOutput()方法来读取设备上的文件
4、Activity各种情况下的生命周期
(1)两个Activity(A->B)切换(B正常的Activity)的生命周期:onPause(A)->onCreate(B)->onStart(B)->onResume(B) ->oStop(A)
这时如果按回退键回退到A:onPause(B)->onRestart(A)->onStart(A)->onResume(A)->oStop(B)
如果在切换到B后调用了A.finish(),则会走到onDestory(A),这时点回退键会退出应用
(2)两个Activity(A->B)切换(B透明主题的Activity或是Dialog风格的Acivity)的生命周期:onPause(A)->onCreate(B) ->onStart(B)->onResume(B)
这时如果回退到A: onPause(B)->onResume(A)->oStop(B)->onDestory(B)
(3)Activity(A)启动后点击Home键再回到应用的生命周期:onPause(A)->oStop(A)->onRestart(A)->onStart(A) ->onResume(A)
(4)横竖屏切换的时候,Activity 各种情况下的生命周期
如果AndroidMainfest.xml中该Activity中的android:configChanges="orientation|keyboardHidden",则只会打印onConfigurationChanged
(5)Activity上有Dialog的时候按Home键时的生命周期
AlertDialog并不会影响Activity的生命周期,按Home键后才会使Activity走onPause->onStop,AlertDialog只是一个组件,并不会使Activity进入后台
AlertDialog和Toast是通过WindowManager.addView()
来显示的,AlertDialog和Toast可以看做是当前Activity的一部分View
5、Activity与Fragment之间生命周期比较
Activity:
(1)onCreate():Activity创建界面时,调用此方法
(2)onStart():Activity界面可见时,调用此方法
(3)onResume():界面获得焦点可以和用户可交互时,调用此方法
(4)onPause(): 界面可见(变为半透明或弹出对话框)但失去焦点不可以和用户交互,调用此方法
(5)onStop(): 界面完全不可见时 ,调用此方法
(6)onDestroy(): Activity被销毁时,调用此方法
(7)onRestart():界面由不可见变为可见时,调用此方法和onStart()方法
Fragment:
(1)onAttach():Fragment和Activity关联时,调用此方法
(2)onCreate():创建Fragment时,调用此方法
(3)onCreateView():加载Fragment的ui布局时,调用此方法
(4)onActivityCreated():Activity的onCreate方法完成时,调用此方法
(5)onStart(): Fragment和Activity一起启动且可见时,调用此方法
(6)onResume():Fragment获取焦点时,调用此方法
(7)onPause()