安卓基础组件 | 青训营笔记

135 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

  • 安卓基础组件

    • Activity

      • 基本介绍

        activity是安卓四大基本组件之一,需要在程序清单AndroidManifest中声明,然后在MainActivity中绑定

image.png

image.png

    -   `Activity`生命周期


        -   `onCreate()`:该方法在活动第一次创建的时候被调用,你应该在该方法中完成活动的初始化操作,比如加载布局、绑定事件等等。
        -   `onStart()`:该方法在活动由不可见变为可见的时候调用。
        -   `onResume()`:该方法在活动准备好和用户进行交互的时候调用,此时活动一定位于栈顶,且处于运行状态。
        -   `onPause()``Actvity`失去焦点或已暂停,`Activity`界面部分可见,下一个生命周期是`onResume(`)或`onStop()`
        -   `onStop()`:这个方法在活动完全不可见的时候调用,它和`onPause()`最主要的区别在于,如果启动的新活动时对话框模式(以前的活动并不是完全不可见),那么这时候以前的活动会执行`onPause()`但是不会执行`onStop()`        -   `onRestart()`:重启已停止的`Activity`,下一个回调是`onStart()`
        -   `onDestory()`:销毁`Actvity`,释放该Activity的所有资源
        -   `onSaveInstanceState()`:在非正常关闭时回调,用于保存数据,不支持持久化数据
        -   `onRestoreInstanceState()`/`onCreate()`:用于恢复数据

image.png

    -   利用`Activity特性`解决接电话Crash问题

        产生原因:页面被回收导致本地变量被置空

        方法:

        1、添加判空逻辑避免空指针问题

        2、在页面回收生命周期中存储数据,页面重建时进行恢复`onSaveInstanceState()`中写入需要保存的数据

        `onRestoreInstanceState()`进行数据恢复

    -   `Activity`的四种启动模式

        `Standard` 默认模式,允许Activity重复

        `SingleTop`栈顶复用,不允许Activity连续重复

        `SingleTask`栈内复用,不允许栈内Activity重复

        `SingleInstance`全局复用,系统全局不允许Activity重复

-   `Fragment`

    -   基本用法

        -   1、创建Fragment布局文件

            ```
            <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            </FrameLayout>
            ```

            2、将 Fragment 添加到 Activity

            ```
             @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_container);
            ​
            ​
                    fragmentManager = getSupportFragmentManager();
                    fragmentTransaction = fragmentManager.beginTransaction();
            ​
                    if(findViewById(R.id.fl_Container1) != null){ //确认有一个Fragment容器
            ​
                        if(savedInstanceState != null){ //如果activity是resumed,再生成一个Fragment会覆盖原来的Fragment
                            return;
                        }
            ​
                        fragment_1 = new Fragment_1();
                        //实例化一个自定义Fragment类的对象,并将此对象添加到容器Activity中
                        fragmentTransaction.add(R.id.fl_Container1,fragment_1).commitAllowingStateLoss();
                        //调用commit方法后才会生效,commitAllowingStateLoss宽容显示,允许一些横竖屏幕切换等情况下会出现的错误。
                    }
                }
            ```

            3、Activity 与 Fragment,Fragment 与 Fragment 的通信

            3.1、Activity向Fragment通信 ① 拿到Fragment的引用,直接调用其public方法。

            ② 如果Activity中未保存任何Fragment的引用,每个Fragment都有一个唯一的TAG或者ID, 可以通过下面两种方式获得其引用

            ```
                ● getFragmentManager( ).findFragmentByTag(String tag) 
                ● getFragmentManager( ).findFragmentById(int id)  
            ```

            ③ 在Activity里使用 `fragment.setArguments(bundle)` 方法,通过Bundle传递数据,在Fragment里使用`Bundle bundle = getArguments()`获取数据。

            3.2、Fragment向Activity通信 ① 在Fragment中可以通过 `getActivity()` 得到当前绑定的Activity的实例,然后进行操作。

            ② 在Fragment中定义接口,在Activity中进行接口回调。

            3.3 Fragment与Fragment

            假设有F1 和 F2

            ① F1通过当前绑定的Activity拿到 F2的引用。

            ② 在F1中定义接口,在Activity中进行接口回调,由Activity操作F2。

            ③ 通过广播。

    -   生命周期

        方法:

        ```
                onAttach方法:顾名思义,是Fragment和Activity建立关联的时候调用。
                onCreateView方法:为Fragment加载布局时调用。
                onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
                onDestroyView方法:Fragment中的布局被移除时调用。
                onDetach方法:顾名思义,是Fragment和Activity解除关联的时候调用。
        ​
        ```

        验证:

image.png

image.png

-   `Service`

    -   基本用法

        1 注册:`AndroidManifest`中使用`<servrce.../>`标签

        2创建:建立相应的`Service`实现类

        3加载:`startService()/bindService()`

    -   生命周期

        方法:

        ```
        onStartCommand() 当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果自己实现此方法,则需要在服务工作完成后,通过调用 stopSelf() 或 stopService() 来停止服务。(在绑定状态下,无需实现此方法。)
        onBind()   当另一个组件调用 bindService() 与服务绑定时,系统将调用此方法。在此方法中必须返回 IBinder 提供一个接口,供客户端与服务器进行通信。如果不希望允许绑定,则可以返回 null 。
        onCreate()  首次创建服务时,系统调用次方法来执行一次性程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已经运行则不会调用此方法。
        onDestory() 当服务不再使用且将被销毁是,系统调用此方法。服务应该实现方法来清理所有资源,如线程、注册的监听器,接收器等。
        ```

image.png

    -   与`Activity`通信

        1定义Binder子类,并实现`getService()`方法,返回`Service`对象

        2实现`Service``onBind()`方法,返回上述`Binder`对象,

        3实例化`ServiceConnection`对象,实现`onServiceConnected()`方法,从中获取到`Service`实例

        4 `Activity`中调用`bindService()`方法,并传递步骤3`ServiceConnection`对象,将流程跑起来

        5 `Activity`既可以通过调用`Service`实例中的方法进行直接通信

-   `BroadcastReceiver`

    -   静态广播

        1注册∶`AndroidManifest`中使用`<receiver.../><intent-filter../>`

        2创建∶建立相应的`BroadcastReceiver`实现类

        3接收∶在步骤2类onReceive()中接收广播

        4发送`Context.sendBroadcast()`

    -   动态广播

        注册:`Context.registerReceiver()`

    -   常用系统广播

        ```
        Intent.ACTION_CONNECTIVITY_CHANGE
        Intent.ACTION_BATTERY_CHANGED 
        Intent.ACTION_SCREEN_ON 
        Intent.ACTION_SCREEN_OFF 
        Intent.ACTION_PACKAGE_INSTALL 
        Intent.ACTION_BOOT_COMPLETED 
        Intent.ACTION_PACKAGE_ADDED 
        Intent.ACTION_PACKAGE_REPLACED 
        Intent.ACTION_PACKAGE_REMOVED
        ```

-   `ContentProvider`

    -   基本用法

        生产者

        1、注册∶`AndroidManifest`中使用`<provider.../>`

        属性∶`authorities/exported/readPermission/writePermission`

        2、创建∶建立相应的`ContentProvider`实现类

        方法∶`onCreate/getType/insert/delete/update/query`

        消费者

        1、声明∶`AndroidManifest`中声明权限

        2、使用∶`context.getContentResolver()`

        方法∶`insert/delete/update/query`

\