2022年04月
1、kapt是什么?
Kotlin annotation processing tool(Kotlin 注解处理工具)缩写。
在 permissionsdispatcher 这个库中有使用
详细介绍请看:www.kotlincn.net/docs/refere…
2、AndPermission 最新版本是2.0.3,为什么安装不了?
3、kotlin中的for循环如何写?
主要利用 in 关键字。
4、如何展示 Camera 的图像?
5、定时器的写法?
定时器用 CountDownTimer 比较好
6、开启另外一个页面,用kotlin优化的写法是什么?
使用apply 或者 let,内部采用的思想还是构建者思想,因为 let 和 apply 返回的都是调用者本身。
val intent = Intent(this, MainActivity::class.java).let { it.putExtra("test", "test") }
7、apply 和 let 的区别?
apply 在 大括号中不需要写it,并且返回的是调用者
let 在大括号中有一个默认的参数 it ,并且有返回值, 返回值可以不用是调用者
8、添加向上导航栏功能是什么?
Activiy1 -> Activity2 -> Activity3 点击向上的返回按钮,从Activity3 页面会返回的Activity1页面
developer.android.com/training/ba…
20220430
9、kotlin 中强转为另外一种类型,怎么设置?
使用 as 关键字,context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
10、kotlin中如何实现一个接口?
使用 object 关键字
private val listener: SensorEventListener = object : SensorEventListener {
// 传感器方向改变时会调用
override fun onSensorChanged(p0: SensorEvent?) {
Log.e(TAG, "传感器改变了")
}
// 当传感器的精度发生变化时会调用
override fun onAccuracyChanged(p0: Sensor?, p1: Int) {
Log.e(TAG, "传感器的精度改变了")
}
}
11、针对日志大量输出,怎么优化呢?
可以使用下面的工具类
12、raw 和 assets 的区别?
(1)是否可以创建目录:raw下不能创建,assets目录下可以创建。
(2)是否可以通过id来引用,比如raw下的资源可以通过R.raw.xx来引用,但是assets下的目录不行。
13、限定符值 ar(阿拉伯)和 ldrtl (从右到左)哪一个的权限更高?
ar 具有更高的权限。
14、 如果应用需要做从右到左的布局,必须设置2个属性是什么?
则必须将 supportsRtl 设置为 "true",并将 targetSdkVersion 设置为 17 或更高版本。
15、如果有多个限定符,那么他们之间是有顺序的吗?
如果是有多个限定符,那么他们之间是有顺序的。
比如:错误:drawable-hdpi-port/ 正确:drawable-port-hdpi/
2022年05月
16、在哪种场景下,横竖屏切换的时候,页面会丢失数据?
(1)当页面有CheckBox的时候,横竖屏切换的时候,CheckBox的状态会发生改变。
(2)Bitmap传递不支持,比如在onSaveInstance中通过outState.putParcelable( "test", BitmapFactory.decodeResource(resources, R.drawable.bg_spinner) ) 设置数据,然后在onRestoreInstanceState方法中通过savedInstanceState.getParcelable("test") 获取Bitmap的数据,那么此时获取的Bitmap为null。
17、在横竖屏切换的时候,页面数据不丢失,应该怎么做?
(1)首先禁止页面进行旋转,在清单文件中配置configChange属性。
(2)使用onSvaeInstanceState和onRestoreInstanceState方法进行存储数据和恢复数据。
(3)或者使用ViewModel。
18、当配置改变的时候,体验好吗?
当配置改变的时候,可能需要重新需要建立连接,然后显示大量数据,那么此时配置变化的时候,体验就非常的不好。
19、onSaveInstanceState 和 onRestoreInstanceState 方法在保存数据和恢复数据方面有什么缺点?
(1)不支持位图传递。
(2)onSaveInstanceState 和 onRestoreInstanceState 都是在主线程中执行的。
20220505
20、okhttp 框架中看见了constructor前面修饰了internal,internal 用来干什么?
open class OkHttpClient internal constructor
使用了internal 以后,那么这个构造函数就只能在Modal内部使用,如果外面的modal想使用此HttpClient,那么必须用其他的构造函数。
21、OkHttpClient 应该是单例的吗?
OkHttpClient 应该是单例的,用连接池和线程池来维护,这样可以节省内存和减少延迟。
22、koltin中 @get:JvmName("fastFallback") 是干什么的?
代码中如下:
@get:JvmName("fastFallback") val fastFallback: Boolean = builder.fastFallback
JvmName 相当于起了一个别名。给Java代码调用使用的。
如果没有@get:JvmName("fastFallback")修饰,那么调用方式如下:
okHttpClient.getFastFallback();
如果增加@get:JvmName("fastFallback")修饰,那么调用方式如下:
okHttpClient.fastFallback();
23、OkHttpClient 的结构是什么?
(1)OkHttpClient 使用了构建模式,使用了内部类Builder。
(2)通过Builder来设置OkHttpClient的属性,包括拦截器,包括缓存的设置。
24、携程本质上是什么?
携程本质上是一个线程。
25、runBlocking 函数是阻塞的主线程吗?
是阻塞主线程,通过在内部打印日志信息来验证。
runBlocking { // 但是这个表达式阻塞了主线程
delay(2000L) // ……我们延迟 2 秒来保证 JVM 的存活
Log.e(TAG, "runBlocking")
Log.e(TAG, Thread.currentThread().name)
}
26、pseudolocale 是用来干什么的?
用来测试国际化的。
27、aapt是什么?
28、抖音为啥只适配了 armeabi - v7a 版本?
通过aapt,发现抖音只适配了 armeabi - v7a 版本。
29、Quantity Strings 是干什么用的?
用来在不同的语言下,对数量进行转换,比如我在英文目录下定义
<plurals name="plural_name">
<item quantity="zero">00000</item>
<item quantity="one">11111</item>
<item quantity="two">22222</item>
<item quantity="few">3333</item>
<item quantity="many">44444</item>
<item quantity="other">55555</item>
</plurals>
那么通过下面代码,当count == 1的时候,会输出11111,当count 为其他的时候,会输出5555。
val count = 1
val quantityString = resources.getQuantityString(R.plurals.plural_name, count, count)
Log.e(TAG, quantityString.toString())
注意:
在其它语言环境下,那么这种取值规则又会不同。
30、如果想在资源文件中写一些特殊的字符,比如 < 或者 @,应该怎么处理呢?
办法1:可以用转义字符。
办法2:或者用 “ ” 来括住,然后“ ” 内部可以写一些特殊字符。
官网介绍如下:
developer.android.google.cn/guide/topic…
31、资源文件中如何表示占位符?
%1d:表示数字占位符
32、使用 HTML 标记设置样式 为什么不生效?
必须要使用下面的方式才可以
<string name="welcome_messages">Hello %1$s <big>%2$d World</big>.</string>
val tv = findViewById<TextView>(R.id.tv)
val text: String = getString(R.string.welcome_messages, "zhangsan", 123)
val styledText: Spanned = Html.fromHtml(text,0)
tv.text = styledText
注意:首先要使用转义字符 <,然后要使用 Html.fromHtml 方法以后才可以。
33、如何下载字体?
方法1:在一些网站上,下载相关字体,然后将字体导入进来,然后进行修改。
方法2:在Design界面,然后选择TextView,然后选择fontFamily,然后选择More Fonts
然后点击右侧 add font to project,这个时候就会在font中目录下创建了ttf文件。
然后通过下面的方式进行
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/beth_ellen"
android:text="Hello, World!"
android:textSize="40sp" />
34、TypeArray 用在什么地方?
(1)用在自定义控件的获取属性的地方。
(2)是一种是在官网看到的类型化数组,可以在xml中定义多种类型。
developer.android.google.cn/guide/topic…
20220516
35、SurfaceView + Camera 当锁屏,然后重新解锁,页面卡死?
20220519
36、uses-sdk 中的 tools:overrideLibrary="xxx" 是用来干什么的?
当 第三方库中的最低版本 > 项目的最低版本 会出现这样的问题。
37、如要应用主题中定义的值,第一个值用什么?
第一个字符必须是 ?
,而非 @
第一步:定义attrs.xml文件,用来定义属性colorValue。
<resources>
<declare-styleable name="my_styleable">
<attr name="colorValue" format="color" />
<attr name="backValue" format="reference" />
</declare-styleable>
</resources>
第二步:在themes.xml中定义队形对应的值
<style name="Bule" parent="@android:style/Theme.Light.NoTitleBar">
<item name="colorValue">@android:color/holo_green_light</item>
</style>
第三步:然后在TextView中使用此值
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textColor="?attr/colorValue"
/>
20220520
37、Java项目用什么开发?
IDEA开发
20220524
38、 是用来干什么的?
用来给项目中的页面在桌面增加一个入口图标。
比如项目中的首页为MainActivity,中间页面为TestActivity,那么我可以在左面有2个图标,一个图标点击之后,跳转到MainActivity,一个图标点击以后跳转到TestActivity。
39、 是用来干什么的?
用来指定应用适配在哪些屏幕上,是在mainfest目录下。
Android 系统不管是在安装时,还是在运行时,都不会读取这个文件。
只是给外部服务Google Play 提供信息,告诉他们应该安装在什么设备上,然后Google Play就会对根据此配置进行过滤。
40、grant-uri-permission 用来干什么的?
是写在 provider 中,用来告诉调用者匹配的路径应该是什么。
41、<instrumentation 是用来干什么的?
用来在一些测试框架中使用,可以用来模拟按钮的点击操作。
42、Intent-filter 中必须包含什么?可能包含什么?
intent-filter 中必须包含action,可能包含category、data。
43、 如何使用?
<activity
android:name=".Test3Activity"
android:exported="false" >
<meta-data android:name="test" android:value="1111"/>
<meta-data android:name="test2" android:value="22222"/>
</activity>
然后在页面中
val info = this.packageManager.getActivityInfo(componentName, PackageManager.GET_META_DATA)
val test = info.metaData.getString("test")
provider 中使用meta-data 相当于给 android:name="android.support.v4.content.FileProvider" 传递数据。
44、uses-feature 是用来干什么的?
用来给设备增加一个标签,告诉设备应该具有什么功能,比如有照相机功能,比如有传感器功能,不会在运行的时候有什么影响,只是在Google Play 上进行过滤。
45、uses-library 是用来干什么的?
告诉系统,如果系统(手机系统)上有这个库,那么apk是可以安装的。
如果系统(手机系统)上没有这个库,那么apk是不能安装的。