Android四大组件重难点

Activity

生命周期

  • 注意
  • Acitivity由A-》B切换时,会先执行完A的onPause,然后再执行完成B的OnResume,然后才执行A的onStop,所以不能在onPause中执行耗时操作
  • 当activity中弹出dialog对话框的时候,activity不会回调onPause。然而当activity启动dialog风格的activity的时候,此activity会回调onPause函数。

异常情况下的生命周期

可能引起异常生命周期的几种情形

  1. 资源相关的系统配置发生了改变,比如旋转了屏幕;
  2. 资源内存不足导致的低优先级Activity被杀死;

异常生命周期

  • 异常生命周期会调用onSaveInstanceState函数和onRestoreInstanceState函数来保存和还原原界面数据;
  • 查看源码可以知道,每个View都有onSaveInstanceState方法和onRestoreInsatnceState方法,部分view为我们实现了相关数据的保存;
  • 但是除了View相关的一些数据,就需要我们自己在两个方法中保存于恢复了;
  • onSaveInstanceState的调用时期在onPause和onStop之前,onResotreInstanceState的调用时机在onStart和onResume之间

Activity与Fargment的生命周期

  • 创建过程
Fragment Activity onAttach() onCreate() onCreateView() onCreate() onActivityCreated() onStart() onStart() onResume() onResume() Fragment Activity
  • 销毁过程
Fragment Activity onPause() onPause() onStop() onStop() onDestoryView() onDestory() onDetach() onDestory() Fragment Activity

除了onStart和onResume之外,Fragment的生命周期的顺序都要比Activity早一步;

Activity的启动模式

有四种启动模式:Standard,SingleTop,SingleTask,SingleInstance

  • Standard:这是Activity默认的一种启动方式,在这种模式下,Activity会进入到启动它的Activity的所属任务栈中,并且每一次启动都会重新创建一个实例;
  • SingleTop:栈顶复用模式。在这种模式下,Activity同样会进入到启动它的Acitivity的所属任务栈中,但是如果当该栈顶已经有了该Acitivity的实例时,Activity不会重复创建,同时它的onNewIntent方法会被调用;
  • 没有任务栈的Context无法以以上两种模式启动Activity,比如ApplicationContext,否则会出现异常
  • TaskAffinity参数对Standard和SingleTop模式启动的Activity没有任何影响
  • SingleTask:栈内复用模式。只要指定栈内存在一个Activity实例,那么就不会再重复创建,同时它的onNewIntent会被调用。同时要注意的是,如果该Activity已有实例在指定任务栈中,那么任务栈将弹出在它之上的所有Activity实例
  • SingleInstance:单实例模式。指定该模式的Activity独立存在一个任务栈中,且只存在一个实例。(一般应用于需要给其它应用调用的情况)
  • 默认情况下,所有Activity的任务栈名称为应用的报名,但是可以通过TaskAffinity参数进行修改。
  • 查看当前Activity任务栈的命令:adb shell dumpsys activity
    只查看activity:adb shell dumpsys activity activities

Service

注意

  • Service运行在主线程中,不能进行耗时操作;
  • Service只会创建一个实例,但可以与多个Activity进行绑定;
  • Service有两种启动方式,启动和绑定,当既启动又绑定时,需要两种方式都销毁,Service才会被销毁。

Service的两种启动方式

  1. 通过Context的startService方法启动(使用StopService方式可以停止服务);

生命周期:onCreate -》 onStartCommand -》 onDestroy

  1. 通过Context的bindService方法启动(使用unbindService方法停止服务);

生命周期:onCreate -》 onBind -》onUnbind -》onDestroy

两种启动方式的区别于联系

  • 两种启动方式均能正常运行Service,但是调用的周期函数不同(开发时需要注意生命周期的调用是否满足自己的预期需求);
  • 两种启动方式的停止服务的方式不同;
  • 如果同时使用两种方式启动服务,那么需要使用两种方式去停止服务才能使服务停止;

Service处于独立进程

Activity绑定独立进程中Service的步骤

  1. 创建数据bean类,实现Parcelable接口,以实现序列化;
  2. 创建aidl接口,并定义对应需要实现的方法;
  3. 创建一个类实现aidl接口;
  4. 在Service类的onBind类中返回该类;
  5. 在ServiceConnection接口中返回aidl对应的实现类;
  • 当Service处于独立进程时,Activity与Service的通信属于进程间通信,需要使用到binder机制;

BroadcastReceiver

  • 广播的生命周期很短,不应该在onReceive()中做耗时操作,应该在onReceive()接收事件,然后将耗时操作在Service或Activity中完成;
  • 广播按传递方式分为有序和无序广播。有序便于管理和控制,还能新增传递数据,但需要注意优先级。无序广播效率很高,但是不能控制次序;
  • 广播按传递范围可分为私有广播(App内部)和全局广播,如果只是App内部使用,应该使用私有广播,因为安全,并且效率更高;

ContentProvider

  • ContentProvider一般用于需要分享数据给其它应用的App,例如通讯录;
  • ContentProvider的数据源没有限制,但是通过ContentProvider获取数据的方式与获取数据库数据方式类似;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值