简介:
Activity(活动):与用户交互、具有可视化界面,一个应用通常由多个Activity组成
Service(服务):位于后台,运行长时间耗时操作,无可视化界面
ContentProvider(内容提供者):用于不同应用之间共享数据(例如通讯录信息)
BroadcastRevice(广播接收者):接收广播,在应用程序之间传递信息的机制
Activity:
Activity是什么?
一个Activity是一个单独的界面,由setContentView()方法显示界面,每个Activity需在AndroidMainfest.xml文件中声明,否则不显示不执行此Activity
Android中维持Activity栈,当创建新ActivityA,ActivityA置于Activity栈顶,位于前台,再创建一个ActivityB,同样会被置于栈顶,位于ActivityA之上,此时ActivityA转入后台
Activity生命周期
Activity正常情况下生命周期
onCreate:Activity将被创建,可调用setContentView加载界面布局资源、初始化Activity所需数据
onStart:Activity将被启动,此时Activity已可见,但还在后台(无法与用户交互)
onResume:Activity已可见,出现在前台
onPause:Activity正在停止,可进行存储数据、停止动画等轻量级工作,但不能太耗时,否则影响新Activity显示,旧Activity的onPause执行后新Activity的onResume才可以执行(极端情况下快速返回原Activity,可回到onResume)
onStop:Activity即将停止,做轻量级回收工作,不可太耗时
onDestroy:Activity即将被销毁,回收工作和最终资源释放
onReStart:当用户重新返回原Activity,由onStop->onRestart->onStart
Activity第一次打开:onCreate->onStart->onResume
用户返回桌面或打开新Activity,当前Activity:onPause->onStop,特殊情况当新Activity采用透明模式,当前Activity不会调用onStop
用户退出当前Activity:onPause->onStop->onDestroy
看图理解
![](https://img-blog.csdnimg.cn/img_convert/e3b6c9a188241acb9625afc985c90615.png)
![](https://img-blog.csdnimg.cn/img_convert/a33e604ab07d5dec90184c5a074ab4a7.png)
Activity异常情况下生命周期
资源相关的系统配置发送改变导致Activity被杀死并重新创建
当前Activity:竖屏状态->横屏状态,系统配置发送改变,默认会被销毁并重新创建
生命周期:
旧Activity->onPause->onStop->onDestroy
新Activity->onCreate->
系统在旧Activity调用onStop之前调用onSaveInstanceState并将Activity信息保存在Bundle中
创建新Activity时,将Bundle对象作为参数传递给onReStoreInstanceState和onCreate,以此对旧Activity进行复原
我们可以检查onReStoreInstanceState和onCreate方法,检查是否复原 旧Activity
当Activity设置 Android:configChanges="orientation",不会重新创建
当内存不足将导致低优先级的Activity被杀死
优先级分为三级
前台Activity-与用户正在交互
可见但非前台Activity-比如说弹出一个对话框,导致Activity可见但与用户不可交互
后台Activity-已经被暂停的Activity,比如说执行了onStop,优先级最低
当内存不足,会以此优先级以此杀死Activity所在进程,无四大组件运行的进程,很容易被杀死
Activity四大启动模式
Standard:标准模式(系统默认模式),当启动一个Activity,就会创建一个实例,无论实例是否已存在。Standard的Activity默认进入启动它的Activity所属的工作栈中(若ActivityA启动了ActivityB(标准模式),ActivityB就会进入ActivityA的工作栈)
SingleTop:栈顶复用模式,当此Activity位于栈顶时,将不会创建新实例,同时回调它的onNewIntent方法,通过此参数可以取出当前请求的信息。但若此Activity不位于栈顶,将会重新创建
SingleTask:栈内复用模式,单实例模式,若有Activity所需任务栈,则看此Activity是否存在于栈中,当此Activity存在,则调用此Activity位于栈顶,若此Activity未存在于栈中,则创建此Activity实例压入栈中(默认有clearTop效果,将位于它之上的Activity全部出栈)
SingleIntance:单实例模式,加强版SingleTask模式,此种模式的Activity只能单独存在于一个工作栈,且不许后续创建新Activity
Activity标志位FLAGS
FLAG_ACTIVITY_NEW_TASK
此标志位作用是为Activity指定SingleTask启动模式,其效果和在XML中指定相同
FLAG_ACTIVITY_SINGLE_TOP
此标志位作用是为Activity指定SingleTop启动模式,其效果和在XML中指定相同
FLAG_ACTIVITY_CLEAR_TOP
具有此标志位的Activity,启动时位于它栈顶的Activity都要出栈,通常与SingleTask启动模式联用。标志位与SingleTask联用时,会把它连同它之上的Activity出栈,并创建新Activity位于栈顶(SingleTask启动模式默认有此标志位效果)
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此标志位的Activity不会出现在历史Activity列表中,例如 点击进入顺序:A->B->C,B具有此标志位,当从C返回时直接返回A,而不经过B
Activity通信
Activity之间通信
通过intent.putString(key,value)
利用Bundle进行传值
Activity向Fragment通信
利用Bundle+getArguments()
在Activity中实例化Fragment并使用setArguments绑定Bundle对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在Activity中实例化Fragment并使用setArguments绑定Bundle对象
Bundle bundle=new Bundle(); //创建Bundle对象
bundle.putString("key","value"); //数据充入bundle
Fragment1 fragment1=new Fragment1(); //创建Fragment对象
fragment1.setArguments(bundle); //Fragment对象与Bundle对象关联
}
在Fragment中拿到Bundle实例:
public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_1, container, false);
// 拿到Bundle实例
Bundle bundle=getArguments();
String value=bundle.getString("key");
return view;
}
}
强转型为Avtivity,调用对应Activity的方法
Fragment向Activity通信
在Fragment内部定义回调接口,在Activity中做实现,从而将数据传给Activity
Service:
服务:
后台运行,无可视化界面展示
生命周期
onCreate:若Service没被创建过,将调用startService()执行onCreate,若已创建Service,多次调用startService不会执行onCreate
onStartComand:服务启动时调用,完成一些数据加载工作
onBind:服务被绑定时调用
onUnBind:服务和组件解绑时调用
onDestroy:服务停止时调用
两种启动方式
startService:应用组件通过startService()启动服务,服务处于started状态,生命周期与组件无关,若无组件调用stopService或服务自身调用stopSelf,则会在后台一直调用
bindService:应用组件和服务同生共死,服务处于Bound状态,组件可调用unbindService()方法与服务解绑,回调顺序为onUnbind->onDestroy
当所有组件与服务解绑后,服务会自动被杀死
保证Service不被杀死
提高Service优先级
系统监听Service状态
开启耗时操作
不能在主线程中进行耗时操作(会导致ANR),开启子线程进行耗时操作
使用线程和Handler方式
IntentService
对比父类Service,其回调函数onHandlerIntent中可以进行耗时操作,不必再开线程。当多次调用onHandlerIntent时多个耗时任务会按顺序依次执行(因为内置Handler关联了任务队列)但仅用Service进行耗时操作就很难管理
ActivityManagerService
从字面意义上看,活动管理服务,管理Android四大组件的启动、运行管理调度等
ContentProdiver:
内容提供者:
以封装的方式提供统一方式供不同应用进程访问同一共享数据
三个重要函数:
ContentProdiver:以封装形式提供统一访问接口
ContentResolver:根据不同的URI对ContentProdiver进行不同操作
ContentObserver:观察ContentProdiver数据变化并传递变化
BroadcastReceiver
广播接收者:
在应用程序之间传输信息的机制,能够对广播进行过滤并做出响应
广播形式:
本地广播:只在应用内部传播,安全但只能用动态注册
有序广播:顺序接收广播并处理,同一时刻只有一个广播能接收同一条数据,优先级越高的广播优先接收
普通广播:intent的广播,传给所有广播接收者,顺序随机
粘性广播:等待对应的广播接收者注册后,则结束滞留状态与之匹配
两种注册方式:
静态注册:AndroidManifest文件中注册,只要设备开启,广播则打开
动态注册:使用Context.registerRecevie()注册,当注册的Activity关闭后,广播即失效
挂一位Android大佬,博客干货满满,本博客即是借鉴此大佬 -> Liknananana的博客_CSDN博客-Android 面试,acm入门经典算法题,Spring领域博主