上一篇:android日记(九)
1.Math.abs()一定返回正数吗?
2.Release包如何调试?
官方文档:android:debuggable
是否可以调试应用(即使在处于用户模式的设备上运行时)。如果可以调试,则设为 "true"
;如果无法调试,则设为 "false"
。默认值为 "false"
。buildTypes { release { debuggable true } }
or
<application xmlns:tools="http://schemas.android.com/tools" android:debuggable="true"></application>
WebView.setHorizontalScrollBarEnabled(true)
3.Android签名V1和V2
由于V2版本的签名在Android7.0才开始支持,对7.0以下将无法安装。因此当app的minSdkVersion需要兼容7.0以下设备时,不能只采用V2签名;换言之,如果app无需兼容7.0以下,则应当选择V2签名,确保签名包完全无法被更改,更安全。
4.通过adb shell命令dump app的信息
adb shell dumpsys package <package_name> //获取全部信息 adb shell dumpsys package <package_name> | grep XXX //获取XXX信息
adb shell dumpsys window | grep mCurrentFocus // 或者 adb shell dumpsys window | grep mFocusedWindows
查看微信的包信息
5.android应用设置里的“清除缓存”与“清除数据”分别清除了什么数据
6.Android文件缓存目录
7.Java8的Optional用法
if (user != null) { Address address = user.getAddress(); if (address != null) { Country country = address.getCountry(); if (country != null) { String isocode = country.getIsocode(); if (isocode != null) { isocode = isocode.toUpperCase(); } } } }
使用Optional简化
String nullName = null; String name = Optional.ofNullable(nullName).orElse("default_name");
8.Java内部类引入外部局部变量为何必须是final修饰
int index = 1; protected void onResume() { super.onResume(); backImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { index ++;//编译无误 } }); }
protected void onResume() { super.onResume(); int index = 1; backImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { index ++;//编译不过 } }); }
9.Kotlin内部类引用外部局部变量并修改的原理
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) var index = 1 mapView.setOnClickListener { index ++ } }
反编译成java实现,可以看到,外部局部变量index,在内部类中的实际引用是IntRef包装类引用。
public void onViewCreated(@NotNull android.view.View view, @Nullable Bundle savedInstanceState) { Intrinsics.checkNotNullParameter(view, "view"); super.onViewCreated(view, savedInstanceState); final IntRef index = new IntRef(); index.element = 1; CtripUnitedMapView var10000 = this.mapView; if (var10000 == null) { Intrinsics.throwUninitializedPropertyAccessException("mapView"); } var10000.setOnClickListener((OnClickListener)(new OnClickListener() { public final void onClick(android.view.View it) { int var10001 = index.element++; } })); }
10.kotlin内联函数let、with、run、apply
with函数,本质不是扩展函数,而是定义了一个函数,并将当前对象做为函数的参数。
override fun onBindViewHolder(holder: ViewHolder, position: Int){ val item = getItem(position)?: return with(item){ holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn) holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary) holder.tvExtraInf.text = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews" ... } }
val user = User("Kotlin", 1, "1111111") val result = user.run { println("my name is $name, I am $age years old, my phone number is $phoneNum") 1000 }
mapContainer.addView(FrameLayout(this).apply { layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) addView(initMapView(), ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) })