Android问题

703 阅读7分钟

2022年04月

1、kapt是什么?

Kotlin annotation processing tool(Kotlin 注解处理工具)缩写。

在 permissionsdispatcher 这个库中有使用

详细介绍请看:www.kotlincn.net/docs/refere…

2、AndPermission 最新版本是2.0.3,为什么安装不了?

juejin.cn/editor/draf…

3、kotlin中的for循环如何写?

主要利用 in 关键字。

4、如何展示 Camera 的图像?

juejin.cn/post/709047…

5、定时器的写法?

定时器用 CountDownTimer 比较好

blog.csdn.net/u010356768/…

6、开启另外一个页面,用kotlin优化的写法是什么?

使用apply 或者 let,内部采用的思想还是构建者思想,因为 let 和 apply  返回的都是调用者本身。

 val intent = Intent(this, MainActivity::class.java).let { it.putExtra("test", "test") }

7、apply 和 let 的区别?

blog.csdn.net/qq\_2362184…

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、针对日志大量输出,怎么优化呢?

可以使用下面的工具类

juejin.cn/published

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

www.jianshu.com/p/818806bc2…

使用了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是什么?

juejin.cn/post/709571…

28、抖音为啥只适配了 armeabi - v7a 版本?

通过aapt,发现抖音只适配了 armeabi - v7a 版本。

blog.csdn.net/m0\_3729078…

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、资源文件中如何表示占位符?

%1s:表示字符串占位符 s:表示字符串占位符  %1d:表示数字占位符

32、使用 HTML 标记设置样式 为什么不生效?

必须要使用下面的方式才可以

<string name="welcome_messages">Hello %1$s &lt;big>%2$d World&lt;/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 当锁屏,然后重新解锁,页面卡死?

blog.csdn.net/hzqaqz/arti…

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。

blog.csdn.net/anlidengshi…

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是不能安装的。