• Android四大组件


    简单说说Android的四大套件.

    我们都知道Android四大套件有Activity.Service.Content Provider.Broadcast Receiver,最常见的便是Activity以及Service.

    Activity

    • 什么是Activity:Activity和我们所学的Servlet一样,和客户端服务器打交道

                        Activity是一个负责与用户交互的组件,Activity中所有操作都与用户密切相关,可以通过setContentView(View)来显示指定控件。

                        在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

                        Activity是一种界面系统,只要是界面系统就包含三个组成(控件,布局,事件)

    • 以下是一个用XMind总结的Activity简介

    • Activity生命周期   

          onCreate(Bundle savedInstanceState):

                创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!

          onStart():

                activity变为在屏幕上对用户可见时调用。

          onResume():

                activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。

          onPause():

                activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!

          onStop():

                activity被停止并转为不可见阶段及后续的生命周期事件时调用。

          onRestart():

                重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。

          onDestroy():

                activity被完全从系统内存中移除时调用,该方法被调用

    • 两个子循环,子生命周期

          第一层(内层)循环是:焦点的生命周期循环,在当前Activity的焦点获得与失去中循环,在这个过程中,Activity是始终可见的

          onPause()->onResume()->onPause()

          第二层(外层)循环是Activity周期循环,是当前Activity在可见和不可见之间循环

          onStart()->onResume()->onResume()->onPause()->onStop()

    • 生命周期划分:整体生命周期:onCreate()->...-onDestory()

                      可视生命周期:onStart()->...->onStop()

                      焦点生命周期:onResume()->onPause()

    • 以下是一个Activity生命周期图

    • 以下是用法,示例的参考

    • Activity常用方法:

           setContentView(int resId):设置Activity显示的布局

           View findViewById(int resId)

           finish():关闭当前的activity

    • Activity在屏幕旋转时的生命周期:   

          不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;

          设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;

          设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

    • Activity启动模式: 

          在android里,有4种activity的启动模式,分别为:standard (默认)  singleTop  singleTask  singleInstance

          当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。   

          1. Standared模式(默认)

              我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,

              退出Activity则会在任务栈中销毁该实例。

          2. SingleTop模式

              这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

          3. SingleTask模式

              如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

          4. SingleInstance模式

              当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。

    Service

    • 以下是一个用XMind编写的Service概述

     

    • Service组件开发      

            第一步:继承Service类  public class SMSService extends Service {}

            第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:<service android:name=".SMSService" />

            第三步:启动服务

            方法一:context.startService():调用者与服务之间没有关连,即使调用者退出了,服务仍然运行

            方法二:context.bindService():调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点

    • 启动/停止/绑定Service的相关方法
    1. 启动指定Service

              pubic ComponentName StartService (Intent dervice)

              参数Intent,在该意图中指定启动的目标service.启动方法有显示意图和隐式意图两种

              说明: startService()在ContextWrapper类中定义,该类的父类是Context

              ContextWrapper类是Activity的间接父类和Service的直接父类

              实例:Intent intent = new Intent(元组件,目标Service.class);startService(intent);

          2. 停止Service

              boolean stopService(Intent Service)

              和启动相同

              stopService 方法在ContextWrapper类中定义

          3. 在Service内部停止Service

              final stopSelf()

              该方法不会回调Service中的onDestory方法

          4. 与intent指定的目标Service绑定

              bindService(Intent, ServiceConnection, int flag)

              intent:启动intent对象中指定目标的Service

              conn:实现了ServiceConnection接口的对象,该对象用于监听访问者与service之间的绑定情况,成功后将调用SCNN对象的onServiceConnectend方法

              flags:绑定时是否自动创建Service.值为0是不自动创建Service当Bind_AUTO_CREATE常量(值为1)时,自动创建Service

              Service和其绑定的activity生命周期之间的关系

          5. ServiceConnection接口

              作用:用于监听访问者与Service之间的连接情况,该接口定义了两个方法

              onServiceconnected(Conponentname name, INinder Service)

              作用:绑定成功是触发本方法

              name:被绑定的Service实例

              Service:通过被绑定的Service类中的onBind方法返回一个Ibinder类型的对象

              onServiceDisconnected(ConponontName name)

              绑定出现异常,引用程序出现崩溃时触发本方法

          6. bubindService(ServiceConnection conn)

              解除conn相关的Service的绑定

              conn是一个实现了SCNN的接口的对象

              bubindService执行后,系统会回调Service的onDestory()方法

    • service生命周期       

             onCreate():

             该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。

             onDestroy():

             该方法在服务被终止时调用。与采用Context.startService()方法启动服务有关的生命周期方法

             onStart():

             只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。

             onBind():

             只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

             onUnbind():

             只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用

    • Service绑定原理

            概述:1 一个Ser和一个activity只能绑定一次

                   2 一个activity可以同时绑定多个Service

                   3 一个ser可以和多个act绑定

                   4 当绑定到一个Service,且讲flag设置为BIND_AUTO_CREATE时,如果该Service未创建,在先创建ServiceonCreate0,然后在绑定,如果已创建,则直接绑定

                   5 Ser被多个act绑定只有当所有客户端被解绑才会被destory

                   6 Binder类用于多个客户端与服务端通信,Binder意思是别针,将客户端与服务端绑定到一起

             绑定组件时数据传递分析(代码)

             bindService与startservice比较:

                   1 通过多次调用startService每次都触发Service类中的onStartConnand(),并用Intent对象向Service传递不同的数据,从而达到控制Service,但是不方便

                   2 通过绑定的方式,使用onBind传递给ServiceConnection的Ibinder控制Service方式比较便捷,实际开发中推荐使用这种方式

             关于onServiceDisconnected方法的调用:

                   1 当activity与Service绑定是,若出现进程崩溃,则onServiceDisconnected方法将触发

                   2 当进程被终止是,将触发onServiceDisConnected

                   3 onServiceDisConnected方法由Android系统调用,不要程序触发,不要在此方法中写业务逻辑代码

             onRebind():重新绑定

    • 隐式意图启动Service

             概述:1 使用隐式意图可以启动另外一个应用程序的服务,从而实现跨进程启动服务

                    2 在向清单中注册Service是通过添加intent-filter,允许设备中其他应用程序通过隐式意图启动自己的Service

                    提示:若不想让其他应用程序启动本程序中的Service,不要在Service标签中声明intent-filter

    BroadCastReceiver

           概述:BroadcastReceiver用于接收并处理广播通知(broadcastannouncements)。

                  多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。

           注册广播的几种方以及这些方式有何优缺点?        

                首先写一个类要继承BroadcastReceiver

                第一种:在清单文件中声明,添加

                      <receive android:name=".IncomingSMSReceiver " >

                      <intent-filter>

                           <action android:name="android.provider.Telephony.SMS_RECEIVED")

                      <intent-filter>

                      <receiver>   

                第二种使用代码进行注册如:

                      IntentFilter filter =  new

                      IntentFilter("android.provider.Telephony.SMS_RECEIVED");

                      IncomingSMSReceiver receiver = new IncomgSMSReceiver();

                      registerReceiver(receiver.filter);

                两种注册类型的区别是:

                      1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

                      2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

    ContentProvider        

                简单叙述ContentProvider是如何实现数据共享的。

                     一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content

    providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。

                    要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Contentprovider或者将你的数据添加到一个已经存在的Content  provider中,前提是有相

    同数据类型并且有写入Content provider的权限。

                    如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

     综合

          Android的四大组件它们的作用          

                Activity:

                Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑

                service:

                后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的Intent提供同步和异步的接口

                Content Provider:

                是Android提供的第三方应用数据的访问方案,可以派生Content  Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统

    一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径

                BroadCast Receiver:

                接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型

     

     

          

        

         

  • 相关阅读:
    opencv 编译
    uniapp中使用xgplayer直播、讨论区的简单实现、第三方复制功能
    20192422李俊洁 实验八 Web安全
    PaddleSpeech 安装(ubuntu 20.04)并尝鲜其中的 TTS 功能
    webstorm 自动导入时始终使用单引号
    音视频字幕生成和翻译
    PaddleSpeech TTS 资料汇总
    vue中更新两个不相关组件的方法
    vue关闭ESlint
    两个数组 过滤出另一个数组中的值的方法
  • 原文地址:https://www.cnblogs.com/lwxalxy/p/4690716.html
Copyright © 2020-2023  润新知