这是我参与「第四届青训营 」笔记创作活动的的第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作用相同
- 组件获取:
- Fragment获取Activity中的组件:
getActivity().findViewById(R.id.xxx) - Activity获取Fragment中的组件:
getFragmenManager.findFragmentByld(R.id.fragment.xxx)
- Fragment获取Activity中的组件:
- 生命周期可以用
FragmentTransaction.setMaxLifecycle()手动干预 - 数据传递:
- Activity传数据给Fragment:
setArguments(Bundle bundle) - Fragment传数据给Activity:方法或接口调用直接传递,或通讯传递
- Activity传数据给Fragment:
服务组件(Service)
- Service
- 常用方法:
- onCreate():创建时回调
- onStart(): 开始时回调
- onUnbind(): 当Service上绑定的所有客户端都断开时会回调
- onDeatory(): 关闭时回调
- 运行Service
- Context的startService()方法:Activity与service没有关联,访问者退出了服务还运行
- Context的bindService()方法:有关联,Activity退出了服务就关闭
- 与Activity通信:
- 定义Binder子类,实现个体Service()方法,返回Service对象
- 实现Service类onBind()方法,返回上述Binder对象(自定义的Binder子类)
- 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
- Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
- Activity可以通过调用Service实例中的方法进行直接通信
6
- 常用方法:
广播组件(Broadcast)
- Broadcast
- 作用:系统通过广播实现一对多的通知,通知app
- 静态广播:
- 注册:在AndroidManifest中注册
- 创建:建立相应BroadcastReceiver实现类
- 接收:在实现类的onReceive()中接收广播
- 发送广播:Context.sendBroadcast()
- 动态广播:
- 注册:Context.registerReceiver()
例:
myReceiver = new MyBRReceiver();//myReceiver中写获取到广播后要处理的事 IntentFilter itFilter = new IntentFilter(); itFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(myReceiver, itFilter); - 注册:Context.registerReceiver()
数据组件(ContenProvider & ContentResolver)
- ContentProvider(数据提供者)
- 作用:数据通信,让app之间可以读取数据
- 原理:让生产者app注册一个uri,消费者app使用ContentProvider通过uri即可操作生产者app中的数据
- 生产者:
- 注册:使用<provider.../>标签,并选择属性
- 创建:建立相应的ContentProvider实现类
- 方法:onCreate(),getType(),insert(),delete(),update()修改,query()查询
- 消费者:
- AndroidManifest中声明权限
- 使用context.getContentResolver()
- 例:
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(); }
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
- 作用:处理多线程间的通信,子线程向主线程传递消息
- 使用方法:
- 创建Handler,实现handleMessage(Message)
- 构造Message:what/setData()
- 发送:子线程调用Handler.sendMessage(Message)发送Message
- 处理:在Handler的handleMessage(Message msg)主线程更新UI
- 原理:消息队列(Looper有休眠机制,调用Handler时才会唤醒)
Binder
- 作用:实现跨进程间通信(效率高,只需要一次内存交换)
- 使用:
- 服务端
- 定义一个AILD文件
- 实现描述的接口,编写service
- 如果有实体类,需要提供实体类(jar包形式)
- 客户端
- 拿到AIDL文件
- 绑定服务,获得接口持有对象
- 服务端
- 原理:
- 服务端通过Binder驱动注册ServiceManager进程,客户端通过Binder驱动