Android四大组件
- Activity、BroadcastReceiver、ContentProvider、Service
四大组件生命周期方法和简单用法
-
Activity生命周期方法:
onCreate()、onStart()、onResume、onPause()、onStop()、onDestroy()、onRestart()Activity的生命周期:Activity生命周期
Activity的启动流程:Activity的启动流程 -
BroadcastReceiver生命周期方法:
onReceive()BroadcastReceiver简单用法和工作过程:BroadcastReceiver 工作过程
-
ContentProvider方法:
onCreate()、getType()、query()、insert()、delete()、update()。onCreate()会在ContentProvider创建时调用。其它需要ContentResolver的对应方法触发。
ContentProvider用法:ContentProvider使用
-
Service生命周期方法:
1、 startService 生命周期:
onCreate -> onStartCommand -> onDestroy
重复启动会执行onStartCommand2、bindService 生命周期:
onCreate -> onBind -> onUnbind -> onDestroy
重复绑定不会走生命周期方法Service的启动流程:Service启动流程 , Android Service使用
Activity之间的通信方式
- Intent : 启动Activity的时候通过Intent传值,可以跨进程通信
- BroadcastReceiver : 通过广播可以实现跨进程、实时、互相通信
- Service : 通过bindService 的方式可以实现跨进程、实时、相互通信。
缺点:比较复杂 - 通过Application的全局变量、File、数据库、SharedPreference 可以实现Activity之间通信。缺点:不能实时通信。
- EventBus 之类:实时,不能跨进程
Activity 各种情况下的生命周期
- 正常生命周期大家都知道,这里主要是异常情况、横竖屏以及不同启动模式下的生命周期:
参考:Activity生命周期,activity启动模式
Activity与Fragment之间生命周期比较
-
首先要知道Fragment 11个生命周期方法:
onAttach、onCreate、onCreateView、onActivityCreated、onStart、onResume、 onPause、 onStop、onDestroyView、onDestroy、onDetach
-
在Activity中添加Fragment,Activity和Fragment完整生命周期如下:
Activity: onCreate
fragment: onAttach
fragment: onCreate
fragment: onCreateView
fragment: onActivityCreated
Activity: onStart
fragment: onStart
Activity: onResume
fragment: onResume
fragment: onPause
Activity: onPause
fragment: onStop
Activity: onStop
fragment: onDestroyView
fragment: onDestroy
fragment: onDetach
Activity: onDestroy
两个Activity之间跳转时必然会执行的是哪几个方法?
- A 必然会执行:
onPause
, 因为B如果是个透明主题的Activity,就不会执行onStop方法。 - B 必然会执行:
onStart、onResume
, 因为如果B是SingleTask
启动模式,并且已经在栈内存在,则不会再次创建。
前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,触发回调方法。
- 前台切换到后台 : onPause、 onStop
- 回到前台 :onRestart、onStart、onResume
- 弹出Dialog时触发 :onWindowFocusChanged, 弹出hasFocus为false,消失hasFocus为true。
Activity的四种启动模式对比
- Standard :默认启动模式,每次启动都会创建一个Activity实例
- SingleTop :栈顶复用模式,当要启动的Activity位于栈顶时,则直接复用此Activity,不会创建新的Activity。并且触发
onNewIntent
方法。此过程声明周期方法:onPause、 onNewIntent、 onResume
- SingleTask : 栈内复用模式,当要启动的Activity已经位于栈内,则不会重新创建,而是直接销毁位于该Activity栈上面的其他实例,使该Activity位于栈顶。该Activity声明周期为:
onNewIntent、 onRestart、onStart、onResume
- SingleInstance : 单实例模式,加强的SingleTask模式,除了具有SingleTask特点,系统还会为此模式的activity单独创建一个任务栈,使该activity单独位于一个任务栈中
参考:activity启动模式
Activity状态保存于恢复
Activity状态恢复一般指横竖屏切换时(或者当内存不足时,被回收的后台Activity),Activity销毁与重建时数据的保存与恢复。
- onSaveInstanceState : 在该方法中保存数据。在onStop之前调用
- onRestoreInstanceState : 在该方法中恢复保存的数据。onStart之后调用
当Activity在manifest中设置configChanges属性时:android:configChanges="orientation"
,横竖屏切换Activity不会销毁重建,而是执行onConfigurationChanged
方法
Fragment之间传递数据的方式?
- 广播
- 全局变量通过set、get方法传递
- 本地存储
- EventBus之类
service和activity怎么进行数据交互?
- 通过广播 : 优点:支持跨进行
- 通过EventBus之类 : 缺点:不支持跨进程
- 通过AIDL : 跨进程方案
- bindService : 绑定时通过Intent传值给Service,绑定成功后在
onServiceConnected
中获得在onBind
方法中返回的IBinder
实例,通过该IBinder实例调用Service中的方法。 可参考:Android Service使用
谈谈你对ContentProvider的理解
ContentProvider是应用程序间共享数据的接口,通过ContentProvider可以实现不同应用程序间的数据共享。
说说ContentProvider、ContentResolver、ContentObserver 之间的关系
- ContentProvider : 内容提供者。内部类
Transport
是一个Binder
子类,并且实现IContentProvider
接口,负责接收ContentResolver请求,并调用ContentProvider增删改查方法 - ContentResolver : 内容解析者。通过
authority
属性,获得对应IContentProvider
对象,调用IContentProvider增删改查方法,通过Binder机制,在ContentProvider 内部类Transport中接收。 - ContentObserver : 内容观察者。通过
getContentResolver().registerContentObserver(uri,notifyForDescendants,observer)
注册观察者,当uri中内容发生变化时,会触发监听。
广播的分类
- 普通广播 : sendBroadcast, 所有注册的广播都能收到
- 有序广播 : sendOrderedBroadcast, 优先级高的先收到,并且有修改广播内容和决定是否继续下发给低优先级广播的权利
广播使用的方式和场景
- 静态注册 : 在XML文件中注册。场景:需要时刻监听广播
- 动态注册 : registerReceiver()。 场景:特定页面监听广播
本地广播和全局广播有什么差别?
- 注册方式 : 本地广播只能通过
LocalBroadcastManager
进行注册、发送、解除注册等。LocalBroadcastManager.getInstance(this).registerReceiver()
- 作用域 : 全局广播可以是应用内和应用之间使用,本地广播只能本应用内使用。
AlertDialog,PopupWindow,Activity区别
- 级别不同 : Activity 是四大组件之一,而AlertDialog、PopupWindow都是依附在DecorView上的,即依附在Activity上。
- 是否阻塞 : PopupWindow点击阴影背景弹框不能消失,除非调用dismiss方法,AlertDialog可以消失
- 背景是否全屏 : PopupWindow 背景可以不是全屏显示,AlertDialog背景全屏显示
Application 和 Activity 的 Context 对象的区别
-
继承关系:Activity -> ContextThemeWrapper -> ContextWrapper -> Context,
Application -> ContextWrapper -> Context, -
声明周期长短 : Activity中的Context是当前页面的Context,Application的Context是整个应用的Context
Android属性动画特性
- 可以对任意对象的属性执行动画操作
- 真正改变View的本身属性(区别于补间动画只改变View的显示效果)
Android中数据存储方式
- 使用SharedPreferences存储数据。/data/data/Package Name/Shared_Pref
- 文件存储数据
- SQLite数据库存储数据。 /data/data/Package Name/database
- 使用ContentProvider存储数据
- 网络存储数据
介绍下SurfView
SurfaceView 是 Android 中一种比较特殊的视图(View),它跟平时时候的 TextView、Button 最大的区别是它跟它的视图容器并不是在同一个视图层上,它的 UI 显示也可以不在一个独立的线程中完成,所以对 SurfaceView 的绘制并不会影响到主线程的运行。综合这些特点,SurfaceView 一般用来实现动态的或者比较复杂的图像还有动画的显示。
Fragment懒加载
Fragment懒加载就是Fragment可见(并且已经执行onCreateView加载布局)后才进行数据加载。
可以通过setUserVisibleHint(boolean isVisibleToUser)
(ViewPage中)或者onHiddenChanged(boolean hidden)
(FragmentManager管理)方法来判断是否可见,进行数据加载。
Fragment嵌套Fragment,通过getChildFragmentManager(),让当前的Fragemnt去管理Fragment。