Android四大组件详解

时间:2022-12-21 12:47:48

一、Android四大组件:Activity(活动)、Service(服务)、ContentProvider(内容提供者)、BroadCastReceiver(广播接收器)

    Activity(活动):一个显示用户界面并且提供用户交互的应用程序组件

    Service(服务):一个在后台执行的进行耗时操作的应用程序组件

    ContentProvider(内容提供者):一个用来暴露数据接口用于应用程序之间数据共享的应用程序组件

    BroadCastReceiver(广播接收器):一个用来进行组件之间消息异步传递的应用程序组件


二、Activity:

    1、生命周期:

       生命周期方法:onCreate() onStart() onRestart() onResume() onPause() onStop() onDestory()

       启动一个Activity:onCreate()--->onStart()--->onResume()

       销毁一个Activity:onPause()--->onStop()--->onDestory()

       当一个Activity(A)被另一个Activity(B)完全覆盖,则:A onPause()--->B onCreate()--->B onStart()--->B onResume()--->A onStop()。此时在栈(回退栈)中,B在A的上面。

       锁屏时:onPause()--->onStop()

       点击Home键退回后台时:onPause()--->onStop()

       从锁屏状态或者后台回到前台,onRestart()--->onStart()--->onResume()

    2、横竖屏切换:

         (1)由竖屏切换到横屏,生命周期变化为:onPause()--->onSaveInstanceState()--->onStop()--->

onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()

           再由横屏切换到竖屏,则为:onPause()--->onSaveInstanceState()--->onStop()--->

onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()

         (2)可以通过如下语句判断应用当前是处于竖屏状态还是横屏状态:

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)

        {

            //横屏

        } else if (getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT)

        {

            //竖屏

         }

         (3)进行横竖屏切换时,Activity会被销毁再重新创建,会重新载入布局,可以设置竖屏状态下和横屏状态下的布局(layout-land)。当然也可以阻止Activity被销毁再重新创建,通过1、在AndroidManifest文件中的对应Activity中配置android:configChanges="keyboardHidden|orientation|screenSize",最好这三个都配置,否则不能适配所有机型或sdk版本;2、在java代码中重载onConfigurationChanged(Configuration newConfig)这个方法。

         (4)也可以阻止横竖屏切换,通过在清单文件中对应的Activity下设置android:screenOrientation="portrait"(比如这就是只显示竖屏),或者在代码中设置也可以setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)(设置成横屏)

     3、Activity的启动模式:

       四种:standard、singleTop、singleTask、singleInstance

   standard:也就是标准的启动模式。每次激活一个Activity都会新建一个Activity对象,不管任务栈中是否存在一个相同的Activity都会新建。

      singleTop:如果Activity位于栈顶,并且设置成singleTop,那么若再次启动该Activity,则不会新建Activity实例

    singleTask:如果Activity被设置成singleTask,那么当启动该Activity时,会先去栈中找有无该Activity实例,如果有,则将该Activity上面的Activity弹出栈,如果没有,则仍然新建该Activity实例。

    singleInstance:新建一个回退栈来存储该Activity实例

   

    Activity的启动模式怎么设置:在清单文件中对应的Activity下

android:launchMode="singleTask"(比如设置成singleTask模式)


三、Service

   1、有两种服务:启动式服务和绑定式服务。通过startService方法启动的服务叫启动式服务,通过bindService方法启动的服务叫绑定式服务。

   2、启动式服务和绑定式服务的区别:(1)启动式服务无法与Activity之间进行通信,与现有的Activity分离,即使Activity被杀掉之后,Service还可以正常运行。(2)启动式服务既可以通过Activity中调用stopService()来结束,也可以通过自己调用stopself()来结束;而绑定式服务则只能通过Activity中调用unbindService()方法来结束

   3、IntentService与Service的关系:IntentService是Service的子类,IntentService采用工作线程处理请求对象,当服务中不是同时处理多个请求时适合使用IntentService。Service既可以同时处理多个请求也可以处理一个请求(可开启多个工作线程)

   4、Service既不是一个进程也不是一个线程


四、ContentProvider

   1、通常与ContentResolver(内容观察者)结合使用,ContentProvider用于暴露数据端,ContentResolver用于访问数据端。ContentProvider用于进程间访问。

   2、ContentProvider对外暴露数据接口,数据是以表格的形式暴露。ContentProvider暴露数据接口,数据可以

是文本数据、图片数据、数据库数据

     3、ContentProvider的使用:(1)在清单文件中注册(四大组件的使用都要在清单文件中注册)。

<application>

     <provider
            android:name="com.xxx.server.MyContentProvider"
            android:authorities="com.xxx.server"
            android:exported="true">

     </provider>
</applicaiton>

       (2)创建子类继承ContentProvider。重写onCreate()方法以及对共享数据操作的方法

query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)

insert(Uri uri, ContentValues values)
update(Uri uri, ContentValues values, String selection,String[] selectionArgs)
delete(Uri uri, String selection, String[] selectionArgs)

       (3)客户端和服务端匹配成功的uri匹配成功码

private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    //客户端与服务端uri匹配成功码
    private static final int QUERY = 1;
    private static final int INERT = 2;
    private static final int UPDATE = 3;
    private static final int DELETE = 4;
    private static final int STATUS = 5;

    static {
        sURIMatcher.addURI("com.txy.anywhere", "query", QUERY);
        sURIMatcher.addURI("com.txy.anywhere", "insert", INERT);
        sURIMatcher.addURI("com.txy.anywhere", "update", UPDATE);
        sURIMatcher.addURI("com.txy.anywhere", "delete", DELETE);
        sURIMatcher.addURI("com.txy.anywhere", "status", STATUS);
        sURIMatcher.addURI("com.txy.anywhere", "insert", STATUS);
        sURIMatcher.addURI("com.txy.anywhere", "update", STATUS);
        sURIMatcher.addURI("com.txy.anywhere", "delete", STATUS);
    }


五、BroadCastReceiver

    BroadcastReceiver主要采用异步传播机制进行消息的发送和传递(组件之间消息传递),所谓的异步表示广播的发送方发送广播时只需要将广播进行标记发出,不需要等待接收方给出响应,可以继续进行下面的操作;默认情况下所有的组件(广播接收器)都有接收广播的能力,哪个组件想要接收该广播就可以注册与发送方一致的标记就可以接收处理广播。

    广播接收器相对于其他三个组件,是使用频率比较低的。关于广播接收器我们要掌握它的两种注册方式。

    静态注册:在AndroidManifest.xml文件中注册,<receiver>标签注册,然后是<intent-filter>,里面是<action />,action中注册与发送方一致的标记。静态注册的好处是,当程序关闭或者没有打开的时候,同样可以接收相关的广播。

    动态注册:在代码中注册,创建一个IntentFilter对象,设置想要接收的广播,在onCreate()方法中通过调用registerReceiver()方法来注册广播接收器,在onDestroy()方法中通过调用unregisterReceiver()方法来注销广播接收器。