客户端基础知识&Android系统 | 青训营笔记

38 阅读3分钟

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

一、什么是程序

    从开发者视角看,程序是开发者用自己的经验和知识创造出用于改变世界的一段代码和资源。
而对用户来说,程序是用户为了满足自己需求而一种从第三方获取的界面,可以互动然后产生记忆。

二、组件

1.基础组件

    日常开发中经常用的组件就是基础组件。
    1.1 界面组件(Activity&Fragment)
        Activity是界面容器,用法:先在程序清单里进行注册,然后写布局文件,最后在Activity里进行绑定。
        Activity生命周期:
        - onCreate():创建时回调,一般在此处创建视图和绑定数据
        - onStart(): 已启动,即将进入前台
        - onResume():与用户开始交互,位于Activity栈页
        - onPause(): Actvity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
        - onStop(): Activity不再可见,下一个回调是onRestart()或onDestory()
        - onRestart():重启已停止的Activity,下一个回调是onStart()
        - onDestory():销毁Actvity,释放该Activity的所有资源
        - onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
        - onRestorelnstanceState() / onCreate():用于恢复数据

image.png

            打开页面:1->2->3                关闭页面:4->5->6
            

image.png

      当发生部分遮挡时,会从Resumed状态变为Paused状态,当遮挡恢复时,会从Paused回到Resumed。
      当发生全遮挡时,页面会回调到onStopped(),然后再onRestart(),onStart()回到Started状态,最后可见。
    
        Activity启动模式:
          (一)standard:默认模式,允许重复
          (二)singleTop:不允许连续重复
          (三)singleTask:不允许同个栈内重复,会将之前的页面删除
          (四)singleInstance:整个系统不允许重复
          
        Fragment设计初衷:解决碎片化的问题
        优点:速度快
        Fragment用法:
            (一)创建Fragment布局文件
            (二)创建Fragment子类,加载布局文件
            (三)Activity加载Fragment
                静态加载:布局中绑定
                动态加载:FragmentManager加载
        
        Fragment生命周期:
        

image.png

        Fragment可以通过Activity获取系统资源
            (一)组件获取
                1 Fragment获取Activity中的组件: getActivity().findViewByld(R.id.xxx)
                2 Activity获取Fragment中的组件: getFragmentManager.findFragmentByld(R.id.fragment_xxx)
            (二)数据传递
                1 Activity传数据给Fragment: setArguments(Bundle bundle)
                2 Fragment传数据给Activity:
                    a通过对象直接传递(方法调用/接口调用)
                    b 通过viewmodel / handler / broadcast / eventbus等通信
            
    1.2 服务组件(Service)
        没有界面时,比如后台播放音乐,下载
        基本用法:
            (一)注册:AndroidManifest中使用<service.../>标签
            (二)创建:建立相应的Service实现类
            (三)加载:startService() / bindService()
        
        生命周期:

image.png

        与Activity进行通信
        1 定义Binder子类,并实现getService()方法,返回Service对象
        2 实现Service类onBind()方法,返回上述Binder对象
        3 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
        4 Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
        5 Activity既可以通过调用Service实例中的方法进行直接通信
        
    1.3 广播组件(Broadcast)
        实现1对多的通信,进行事件的通知
       基本用法:
            静态广播:
               1 注册:AndroidManifest中使用<receiver...l><intent-filter...l>
               2 创建:建立相应的BroadcastReceiver实现类
               3 接收:在步骤2onReceive()中接收广播
               4 发送:Context.sendBroadcast()
            动态广播:
               1 注册:Context.registerReceiver()
       常用系统广播:
            Intent.ACTION_CONNECTIVITY_CHANGE
            lntent.ACTION_BATTERY_CHANGED
            Intent.ACTION_SCREEN_ON
            Intent.ACTION_SCREEN_ OFF
            Intent.ACTION_PACKAGE_INSTALL
            Intent.ACTION_BOOT_COMPLETED
            lntent.ACTION_PACKAGE_ADDED
            Intent.ACTION_PACKAGE_REPLACED
            Intent.ACTION_PACKAGE_REMOVED

    1.4 数据组件(ContentProvider&ContentResolver)
        ContentProvider:数据通信
        生产者:
            1 注册:AndroidManifest中使用<provider...l>
              属性:authorities / exported / readPermission / writePermission
            2 创建:建立相应的ContentProvider实现类
              方法:onCreate / getType / insert / delete / update / query
        消费者:
            1 声明:AndroidManifest中声明权限
            2 使用:context.getContentResolver()
              方法:insert / delete / update l query
    1.5 Intent
        基本用法:
            1 显式Intent
              setComponent / setClass指定具体类
            2 隐式Intent
              Action(动作)
              Data(数据)
              Category(类别)
              Type(数据类型)
              Component(组件)
              Extra(扩展信息)
              Flag(标志位)
        系统能力:
            电话:Intent(Intent.ACTION_DIAL, Uri.parse("tel:10010""))
            短信:Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:10010"))
            网页:Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"))
            邮件:Intent(Intent.ACTION_SENDTO,Uri.parse("mailto:someone@domain.com"))
            地图:Intent(Intent.ACTION_VIEW, Uri.parse("geo:39.9,116.3"))
            拍照:Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            设置:Intent(android.provider.Settings.ACTION_SETTINGS)
            市场: Intent(Intent.ACTION_VIEw,uri.parse("market:lldetails?id=" + packageName))