Android--四大组件详解

  1. 简介:


Activity(活动):与用户交互、具有可视化界面,一个应用通常由多个Activity组成
Service(服务):位于后台,运行长时间耗时操作,无可视化界面
ContentProvider(内容提供者):用于不同应用之间共享数据(例如通讯录信息)
BroadcastRevice(广播接收者):接收广播,在应用程序之间传递信息的机制
  1. Activity:


  1. Activity是什么?
  1. 一个Activity是一个单独的界面,由setContentView()方法显示界面,每个Activity需在AndroidMainfest.xml文件中声明,否则不显示不执行此Activity

  1. Android中维持Activity栈,当创建新ActivityA,ActivityA置于Activity栈顶,位于前台,再创建一个ActivityB,同样会被置于栈顶,位于ActivityA之上,此时ActivityA转入后台

  1. Activity生命周期
  1. Activity正常情况下生命周期
  1. onCreate:Activity将被创建,可调用setContentView加载界面布局资源、初始化Activity所需数据

  1. onStart:Activity将被启动,此时Activity已可见,但还在后台(无法与用户交互)

  1. onResume:Activity已可见,出现在前台

  1. onPause:Activity正在停止,可进行存储数据、停止动画等轻量级工作,但不能太耗时,否则影响新Activity显示,旧Activity的onPause执行后新Activity的onResume才可以执行极端情况下快速返回原Activity,可回到onResume)

  1. onStop:Activity即将停止,做轻量级回收工作,不可太耗时

  1. onDestroy:Activity即将被销毁,回收工作和最终资源释放

  1. onReStart:当用户重新返回原Activity,由onStop->onRestart->onStart

  1. Activity第一次打开:onCreate->onStart->onResume

  1. 用户返回桌面或打开新Activity,当前Activity:onPause->onStop,特殊情况当新Activity采用透明模式,当前Activity不会调用onStop

  1. 用户退出当前Activity:onPause->onStop->onDestroy

  1. 看图理解

  1. Activity异常情况下生命周期
  1. 资源相关的系统配置发送改变导致Activity被杀死并重新创建
  1. 当前Activity:竖屏状态->横屏状态,系统配置发送改变,默认会被销毁并重新创建

  1. 生命周期:

  1. 旧Activity->onPause->onStop->onDestroy

  1. 新Activity->onCreate->

  1. 系统在旧Activity调用onStop之前调用onSaveInstanceState并将Activity信息保存在Bundle中

  1. 创建新Activity时,将Bundle对象作为参数传递给onReStoreInstanceState和onCreate,以此对旧Activity进行复原

  1. 我们可以检查onReStoreInstanceState和onCreate方法,检查是否复原 旧Activity

  1. 当Activity设置 Android:configChanges="orientation",不会重新创建

  1. 当内存不足将导致低优先级的Activity被杀死
  1. 优先级分为三级

  1. 前台Activity-与用户正在交互

  1. 可见但非前台Activity-比如说弹出一个对话框,导致Activity可见但与用户不可交互

  1. 后台Activity-已经被暂停的Activity,比如说执行了onStop,优先级最低

  1. 当内存不足,会以此优先级以此杀死Activity所在进程,无四大组件运行的进程,很容易被杀死

  1. Activity四大启动模式
  1. Standard:标准模式(系统默认模式),当启动一个Activity,就会创建一个实例,无论实例是否已存在。Standard的Activity默认进入启动它的Activity所属的工作栈中(若ActivityA启动了ActivityB(标准模式),ActivityB就会进入ActivityA的工作栈)

  1. SingleTop:栈顶复用模式,当此Activity位于栈顶时,将不会创建新实例,同时回调它的onNewIntent方法,通过此参数可以取出当前请求的信息。但若此Activity不位于栈顶,将会重新创建

  1. SingleTask:栈内复用模式,单实例模式,若有Activity所需任务栈,则看此Activity是否存在于栈中,当此Activity存在,则调用此Activity位于栈顶,若此Activity未存在于栈中,则创建此Activity实例压入栈中(默认有clearTop效果,将位于它之上的Activity全部出栈)

  1. SingleIntance:单实例模式,加强版SingleTask模式,此种模式的Activity只能单独存在于一个工作栈,且不许后续创建新Activity

  1. Activity标志位FLAGS
  1. FLAG_ACTIVITY_NEW_TASK

  1. 此标志位作用是为Activity指定SingleTask启动模式,其效果和在XML中指定相同

  1. FLAG_ACTIVITY_SINGLE_TOP

  1. 此标志位作用是为Activity指定SingleTop启动模式,其效果和在XML中指定相同

  1. FLAG_ACTIVITY_CLEAR_TOP

  1. 具有此标志位的Activity,启动时位于它栈顶的Activity都要出栈,通常与SingleTask启动模式联用。标志位与SingleTask联用时,会把它连同它之上的Activity出栈,并创建新Activity位于栈顶(SingleTask启动模式默认有此标志位效果)

  1. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

  1. 具有此标志位的Activity不会出现在历史Activity列表中,例如 点击进入顺序:A->B->C,B具有此标志位,当从C返回时直接返回A,而不经过B

  1. Activity通信
  1. Activity之间通信

  1. 通过intent.putString(key,value)

  1. 利用Bundle进行传值

  1. Activity向Fragment通信

  1. 利用Bundle+getArguments()

  1. 在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对象关联
    }
  1. 在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;
    
    }
}
  1. 强转型为Avtivity,调用对应Activity的方法

  1. Fragment向Activity通信

  1. 在Fragment内部定义回调接口,在Activity中做实现,从而将数据传给Activity

  1. Service:

  1. 服务:
  1. 后台运行,无可视化界面展示

  1. 生命周期
  1. onCreate:若Service没被创建过,将调用startService()执行onCreate,若已创建Service,多次调用startService不会执行onCreate

  1. onStartComand:服务启动时调用,完成一些数据加载工作

  1. onBind:服务被绑定时调用

  1. onUnBind:服务和组件解绑时调用

  1. onDestroy:服务停止时调用

  1. 两种启动方式
  1. startService:应用组件通过startService()启动服务,服务处于started状态,生命周期与组件无关,若无组件调用stopService或服务自身调用stopSelf,则会在后台一直调用

  1. bindService:应用组件和服务同生共死,服务处于Bound状态,组件可调用unbindService()方法与服务解绑,回调顺序为onUnbind->onDestroy

  1. 当所有组件与服务解绑后,服务会自动被杀死

  1. 保证Service不被杀死
  1. 提高Service优先级

  1. 系统监听Service状态

  1. 开启耗时操作
  1. 不能在主线程中进行耗时操作(会导致ANR),开启子线程进行耗时操作

  1. 使用线程和Handler方式

  1. IntentService
  1. 对比父类Service,其回调函数onHandlerIntent中可以进行耗时操作,不必再开线程。当多次调用onHandlerIntent时多个耗时任务会按顺序依次执行(因为内置Handler关联了任务队列)但仅用Service进行耗时操作就很难管理

  1. ActivityManagerService
  1. 从字面意义上看,活动管理服务,管理Android四大组件的启动、运行管理调度等

  1. ContentProdiver:

  1. 内容提供者:
  1. 以封装的方式提供统一方式供不同应用进程访问同一共享数据

  1. 三个重要函数:
  1. ContentProdiver:以封装形式提供统一访问接口

  1. ContentResolver:根据不同的URI对ContentProdiver进行不同操作

  1. ContentObserver:观察ContentProdiver数据变化并传递变化

  1. BroadcastReceiver

  1. 广播接收者:
  1. 在应用程序之间传输信息的机制,能够对广播进行过滤并做出响应

  1. 广播形式
  1. 本地广播:只在应用内部传播,安全但只能用动态注册

  1. 有序广播:顺序接收广播并处理,同一时刻只有一个广播能接收同一条数据,优先级越高的广播优先接收

  1. 普通广播:intent的广播,传给所有广播接收者,顺序随机

  1. 粘性广播:等待对应的广播接收者注册后,则结束滞留状态与之匹配

  1. 两种注册方式:
  1. 静态注册:AndroidManifest文件中注册,只要设备开启,广播则打开

  1. 动态注册:使用Context.registerRecevie()注册,当注册的Activity关闭后,广播即失效


挂一位Android大佬,博客干货满满,本博客即是借鉴此大佬 -> Liknananana的博客_CSDN博客-Android 面试,acm入门经典算法题,Spring领域博主

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值