Android相关
简述Android整体架构
Android采用分层结构,从高到低分别是”应用程序层”、”应用程序框架层”、”核心类库”、”linux内核”
Android 5.0新特性
Material Design
支持多种设备
全新的通知中心设计
支持64位ART虚拟机
电池续航改进计划
全新的“最近应用程序”
改进安全性
不同数据独立保存
改进搜索
新的aip支持/蓝牙4.1
Android 6.0新特性
软件权限管理
网页体验提升
app关联
安卓支付
指纹支持
电量管理
Activity生命周期
Activity的启动方法
显式启动
Intent intent = new Intent(this,OtherActivity.class);
startActivity(intent);
隐式启动
Activity启动模式
1.standard模式
(每启动一个Activity就在栈顶创建一个新的实例)
2. singleTop模式
(每当启动Activity时就会在栈顶检测是否存在该实例,如果没有就新创建一个新的实例)
3. singleTask模式
(保证整个Activity在应用中只会有一个实例,当启动Activity时如果实例存在则复用,并把该Activity上面的其他Activity全部出栈,如果没有就会新创建一个实例)
4. singleInstance模式
(该模式下只有一个实例,并且这个实例只会独立存在在一个任务栈中)
已调用多个Activity后如何安全退出
- 抛出异常强制退出
- 记录打开的Activity并逐个退出
- 发送特定的广播实现安全退出
- 递归退出每个Activity
Service有多少种启动方式
- 调用startService()启动
这种方式启动的服务会长期存在在后台,即时启动它的组件应经被销毁,该服务依然运行。当内存不足时,该服务可能会被杀死。当资源又足够的时候,该服务又会重新启动。
【onCreate()- >onStartCommand()->startService()->onDestroy()】
2.调用bindService()启动
BindService中使用bindService()方法来绑定服务,调用者和绑定者绑在一起,调用者一旦退出服务也就终止了【onCreate()->onBind()->onUnbind()->onDestroy()】。
## 广播的类型
1. 无序广播(不可被拦截)
2. 有序广播(可使用abortBroadcast()来拦截)
广播接收者的注册方式
- 静态注册
在AndroidManifest.xml中注册,一次运行就会注册到系统中,以后无序运行该应用也会接受到广播。 - 动态注册
不在AndroidManifest.xml中注册组件,直接调用Context的registerReceiver()来动态注册。代码运行时,广播接收者才会生效。代码运行结束,广播接收者也会失效。
对ContentProvider的理解
内容提供者是Android的四大组件之一。可用于不同应用间实现数据共享的功能,同时能保证数据的安全性。ContentProvider是使用表的形式来组织数据。无论什么数据过来都会把它当做一个表,然后通过增删改查等方法进行数据的操作。每个ContentProvider都有一个公共的URL,这个URL用于 表示这个ContentProvider所提供的数据。
当外部应用要对ContentProvider中的数据进行 添加,删除,修改,查询时,要使用Con tentResolver来完成。
该对象通过Context.getContextResolver()来创建。
ContextProvider/ContextResolver/ContextObsever三者
- ContextProvider是将应用的私有数据(如数据库)暴露给其他应用,让它们能访问到这些私有数据。同时提供增删改查方法,如果让别的应用访问要暴露一个公共的URL
- ContextResolver 根据URL来进行CRUD操作
- ContextObsever 当ContextProvider中的数据发生变化时,执行其中的回调方法。
对Fragment的理解
Fragment(碎片)必须寄宿在Activity,它可以看做是一个模块化的区域,但是它也有自己的生命周期。
加载方法分别是静态加载和动态加载。
静态加载:直接把Fragment当做普通UI控件放入界面中
动态加载:需要先了解Fragment的事务。事务就是一个原子性/不可拆分的操作。
流程:1.开启一个事务——>通过事务进行Fragment的操作——>提交事务,如果失败则添加不成功。
Http协议的特点
Http(超文本传输协议)是一种请求/响应式的协议。客户端与服务器建立连接后,客户端向服务器发送请求,反之,服务器向客户端返回响应。
1. 简单快速
客户端向服务器请求时,只需发送请求方式和路径
2. 灵活
允许传送任意类型的数据,使用Content-Type来标记
3. 无状态
协议对事务处理没有记忆能力,如果后续处理需要前面的数据需要重新再传
Android中的动画
- Tween Animation 补间动画
- Frame Animation 帧动画
- Property Animation
Android常见的视频播放方式
- 使用自带的播放器
- 使用VideoView
- 使用MediaPlayer与SurfaceView播放
简述对Handler 运行机制的理解
它接收其他线程的消息并通过该消息来通知主线程来更新主线程的内容.
Message: 在线程中传递的信息
MessageQueue:消息集合,用来存放Runnable和Message
Looper:不停地循环消息队列,只要有消息就从中取出
对AsyncTask异步任务的理解
AsyncTask专门处理异步问题,主要是为了耗时操作来开辟一个新线程
(不够熟悉)
如何绘制View
- 测量View尺寸
- 确定View位置
- 绘制View
对AIDL的理解
对ListView控件的优化
- 复用convertView
- 定义存储控件引用类 ViewHolder
- 数据的分批及分页加载
- 图片的处理
1.尽量避免在BaseAdapter中使用static来定义全局变量
2.避免在ListView适配器中使用线程
如何处理网络图片产生的OOM异常
- 调整图片大小·
- 即时回收不用的图片资源
- 缓存图片到内存中
RxJava
RxAndroid
如何进行屏幕适配
- 套图适配
- 9patch适配
- 布局适配
对Android生命周期的一些理解
- 对于onStart和onStop是从Activity是否可见来回调的,而OnResume和onPause是从Activity是否位于前台来回调的。
FlexboxLayout
常用属性:
1. flexDirection 主轴项目排列方向
2. flexWrap 支持换行排列
3. justifyContent 定义项目在主轴上的对齐方式
4. alignItems 定义项目在副轴轴上的对齐方式(单行起作用)
5. alignContent 定义了多根轴线的对齐方式(多行起作用)
子元素的属性:
1. layout_order 默认情况下子元素的排列方式按照文档流的顺序依次排序,而order
属性可以控制排列的顺序,负值在前,正值在后。
Android库
- Butter Knife
- EventBus(Android事件发布/订阅框架) 传统的事件传递方式包括:Handler、BroadcastReceiver、interface回调
EventBus
简化了应用程序各组件间、组件与后台线程间的通信。比如请求网络、等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信。
ButterKnife
优势:
1. 强大的view
绑定、click
事件等处理功能,简化代码
2. 运行时不会影响APP效率,使用配置方便
3. 代码清晰,可读性强
ButterKnife通过APT
编译时解析技术
ScrollView
当ScrollView
的内容大于它本身的size时,ScrollView
会自动添加滚动条,并可以竖直滑动。
[ScrollView][1]
ImageView
ScaleType设置
在layout.xml中定义android:scaleType=”center|centerCrop|centerInside|fitCenter|fitXY|”
[ImageView中ScaleType设置][2]Android Handler中sendEmptyMessage()和sendMessage()有什么区别?
sendMessage()允许你处理Message对象(Message里可以包含数据,)。
sendEmptyMessage()只能放数据
注意:一个传Message类型的msg,一个传int类型的what,传what的,最终会转为msg
[请看这里][3]浅谈MVPinAndroid
View : 对应Activity,负责View的绘制以及与用户的交互
Model : 业务逻辑和实体模型
Presenter : 负责完成View于Model间的交互自定义View
流程
开始 –> 构造函数(View初始化) –> onMeasure()(测量view大小) –> onSizeChanged()(确定view大小)–> onLayout()(确定子view布局(包含子view时使用))
–> onDraw()Toast的封装技巧
public class ToastUtil{ private static Toast toast; public static void showToast(Context context,String content){ if(toast == null){ toast = Toast.makeText(context,content,Toast.LENGTH_SHORT); }else{ toast.setText(content); } toast.show(); } }
Android studio中的如何选择三个SdkVersion
complileSdkVersion
1. 告诉gradle用哪个Android SDK来编译你的应用.
2. 因此我们强烈推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免新弃用的 API ,并且为使用新的 API 做好准备。
minSdkVersion
1. minSdkVersion 则是应用可以运行的最低要求
2. 请记住,你所使用的库,如 Support Library 或 Google Play services,可能有他们自己的 minSdkVersion 。你的应用设置的 minSdkVersion 必需大于等于这些库的 minSdkVersion 。例如有三个库,它们的 minSdkVersion 分别是 4, 7 和 9 ,那么你的 minSdkVersion 必需至少是 9 才能使用它们。在少数情况下,你仍然想用一个比你应用的 minSdkVersion 还高的库(处理所有的边缘情况,确保它只在较新的平台上使用),你可以使用 tools:overrideLibrary 标记,但请做彻底的测试!
targetSdkVersion
1. targetSdkVersion 是 Android 提供向前兼容的主要依据
Android中的Rxjava2.0
原理:基于一种拓展的观察者模式
角色表展示:
角色 | 作用 | 类比 |
---|---|---|
被观察者(Observable) | 产生事件 | 顾客 |
观察者(Observer) | 接收事件,并给出响应动作 | 厨房 |
订阅(Subscribe) | 连接 被观察者 & 观察者 | 服务员 |
事件(Event) | 被观察者 & 观察者 沟通的载体 | 菜式 |
Android中的权限管理
- 例如请求照相机权限(android 5.0以上)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //sdk>=5.0 请求照相机权限
if (checkSelfPermission(Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA},
REQUEST_PERMISSION_CAMERA);
}
}
Android中加一条横线
<View
android:layout_width="fill_parent"
android:layout_marginTop="10dp"
android:layout_height="1dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="#aa000000" />
ViewPager
禁止ViewPager两侧颜色
在布局中设置 android:overScrollMode=”never”
Viewpager的滑动监听器 OnPagerChangeListener
/**
* 滑动监听器OnPageChangeListener
* OnPageChangeListener这个接口需要实现三个方法:onPageScrollStateChanged,onPageScrolled ,onPageSelected
* 1、onPageScrollStateChanged(int arg0) 此方法是在状态改变的时候调用。
* 其中arg0这个参数有三种状态(0,1,2)
* arg0 ==1的时表示正在滑动,arg0==2的时表示滑动完毕了,arg0==0的时表示什么都没做
* 当页面开始滑动的时候,三种状态的变化顺序为1-->2-->0
* 2、onPageScrolled(int arg0,float arg1,int arg2) 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直被调用。
* 其中三个参数的含义分别为:
* arg0 :当前页面,及你点击滑动的页面
* arg1:当前页面偏移的百分比
* arg2:当前页面偏移的像素位置
* 3、onPageSelected(int arg0) 此方法是页面跳转完后被调用,arg0是你当前选中的页面的Position(位置编号)
*/