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

165 阅读4分钟

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

Android基础组件

1.界面组件(Activity & Fragment)

  • Activity
    • 作用:前台交互,程序入口,布局容器
    • 使用:在Manifest文件中声明 -> 创建布局文件 -> java文件与布局文件连接
    • 生命周期:Create, Start, Resumed, Paused, Stopped, Destroyed
    • 常用方法:
      • onCreate() :绑定布局和数据
      • onStart() :初始化app
      • onResume() :将activity调到栈顶使其可见
      • onPause() :使app停止且不能交互但是还是部分可见,保存数据
      • onStop() :使得app完全不可见且会释放资源
        (从Stopped到Started需要onRestart()后再onStart())
      • onDestory() :完全关闭
      • onSaveInstanceState() :保存Activity中每个实例的状态
      • onRestoreInstanceState() :恢复Activity异常销毁之前的状态,即onSaveInstanceState()保存的状态
    • 启动模式 android:launchMode
      • Standard:默认模式,允许重复
      • singleTop:不允许连续的重复
      • singleTask:不允许在同个栈内重复(Set[ ])
      • singleInstance:整个系统内不允许重复(Set)
  • Fragment(轻量级页面容器)
    • 作用:重载速度快,组件的分离
    • 使用:创建布局文件 -> 创建Fragment子类并加载布局文件 -> 与Activity绑定(静态加载:在布局中绑定; 动态加载:FragmentManager加载)
    • 常用方法:
      • onAttach() :使Fragment与Activity建立关联
      • onCreateView() :绑定视图
      • onViewCreated() :返回fragment要显示的布局view
      • onDestroyView(): 移除视图
      • onDetach() :取消与Activity的关联
      • onCreate(),onStart(),onResume(),onPause(),onStop()与Activity作用相同
      • 组件获取:
        1. Fragment获取Activity中的组件:getActivity().findViewById(R.id.xxx)
        2. Activity获取Fragment中的组件:getFragmenManager.findFragmentByld(R.id.fragment.xxx)
      • 生命周期可以用FragmentTransaction.setMaxLifecycle()手动干预
      • 数据传递:
        1. Activity传数据给Fragment:setArguments(Bundle bundle)
        2. Fragment传数据给Activity:方法或接口调用直接传递,或通讯传递

服务组件(Service)

  • Service
    • 常用方法:
      • onCreate():创建时回调
      • onStart(): 开始时回调
      • onUnbind(): 当Service上绑定的所有客户端都断开时会回调
      • onDeatory(): 关闭时回调
      • 运行Service
        • Context的startService()方法:Activity与service没有关联,访问者退出了服务还运行
        • Context的bindService()方法:有关联,Activity退出了服务就关闭
    • 与Activity通信:
      1. 定义Binder子类,实现个体Service()方法,返回Service对象
      2. 实现Service类onBind()方法,返回上述Binder对象(自定义的Binder子类)
      3. 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
      4. Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
      5. Activity可以通过调用Service实例中的方法进行直接通信 6

广播组件(Broadcast)

  • Broadcast
    • 作用:系统通过广播实现一对多的通知,通知app
    • 静态广播:
      1. 注册:在AndroidManifest中注册
      2. 创建:建立相应BroadcastReceiver实现类
      3. 接收:在实现类的onReceive()中接收广播
      4. 发送广播:Context.sendBroadcast()
    • 动态广播:
      • 注册:Context.registerReceiver()
        例:
      myReceiver = new MyBRReceiver();//myReceiver中写获取到广播后要处理的事
      IntentFilter itFilter = new IntentFilter();
      itFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
      registerReceiver(myReceiver, itFilter);
      



数据组件(ContenProvider & ContentResolver)

  • ContentProvider(数据提供者)
    • 作用:数据通信,让app之间可以读取数据
    • 原理:让生产者app注册一个uri,消费者app使用ContentProvider通过uri即可操作生产者app中的数据
    • 生产者:
      1. 注册:使用<provider.../>标签,并选择属性
      2. 创建:建立相应的ContentProvider实现类
      3. 方法:onCreate(),getType(),insert(),delete(),update()修改,query()查询
    • 消费者:
      1. AndroidManifest中声明权限
      2. 使用context.getContentResolver()
      3. 例:
          private void getMsgs(){//读取收件箱信息(需要给权限)
             Uri uri = Uri.parse("content://sms/");
             ContentResolver resolver = getContentResolver();
             Cursor cursor = resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
             while(cursor.moveToNext()){
                 //处理
             }
             cursor.close();
          }
      

ae88467663c9fe50a8d3e266854d4af.png

Intent(意图)

1.作用:用于描述我要做什么事,然后系统才可以处理,常用于启动组件和传递数据
2.基本用法:

  • 显式intent:setComponent/setClass 指定具体的类
  • 隐式intnet:
    • Action:动作
    • Data:数据,包含URI和memitype,Data内容一般有Action决定
    • Category:信息字符串,可以有多个
    • Type:数据类型
    • Component:组件
    • Extra:Bundle对象,以键值对存放数据
    • Flag:告知系统如何启动
  • 常用方法:
    • Intent(String action,Uri uri)
    • Intent(Context packageContext,Class<?> cls):构造方法(显式)
    • setAction(String action)
    • setClass(Context packageContext, Class<?> cls)
    • setData(Uri data):设置 Data 的 uri
    • setType(String type):设置 Data 的 MIME 类型
    • setDataAndType(Uri data, String type):上面两个方法的结合
    • addCategory(String category):添加Category(Intent 可有多个 Category)
    • addFlags(int flags):设置目标组件的启动方式
    • putExtra(String name,value):放入附加数据
    • putExtras(Bundle extras):把封装了数据信息的 Bundle 对象放入 Intent
    • 使用:startActivity(intent)

Handler

  1. 作用:处理多线程间的通信,子线程向主线程传递消息
  2. 使用方法:
    1. 创建Handler,实现handleMessage(Message)
    2. 构造Message:what/setData()
    3. 发送:子线程调用Handler.sendMessage(Message)发送Message
    4. 处理:在Handler的handleMessage(Message msg)主线程更新UI
  3. 原理:消息队列(Looper有休眠机制,调用Handler时才会唤醒) 微信图片_20220729152309.png



Binder

  1. 作用:实现跨进程间通信(效率高,只需要一次内存交换)
  2. 使用:
    • 服务端
      1. 定义一个AILD文件
      2. 实现描述的接口,编写service
      3. 如果有实体类,需要提供实体类(jar包形式)
    • 客户端
      1. 拿到AIDL文件
      2. 绑定服务,获得接口持有对象
  3. 原理:
    • 服务端通过Binder驱动注册ServiceManager进程,客户端通过Binder驱动

微信图片_20220729151521.png

微信图片_20220729152221.png