Android应用开发笔记(1)

不应在UI线程执行耗时过长的操作

主线程上不能执行耗费时间过长的操作, 例如文件读写和网络等操作, 除非开启严格模式, 但正式环境不应使用严格模式

严格模式

所以就介绍一下严格模式
StrictMode类是Android 2.3(API 9)引入的一个工具类, 可以用来帮助开发者发现代码中的一些不规范的问题, 以达到提升应用响应能力的目的. 举个例子来说, 如果开发者在UI线程中进行了网络操作或者文件系统的操作, 而这些缓慢的操作会严重影响应用的响应能力, 甚至出现ANR对话框. 为了在开发中发现这些容易忽略的问题, 我们使用StrictMode, 系统检测出主线程违例的情况并做出相应的反应, 最终帮助开发者优化和改善代码逻辑.
摘抄自: https://www.cnblogs.com/yaowen/p/6024690.html

详见文档: https://developer.android.google.cn/reference/android/os/StrictMode?hl=en
当通过代码启用严格模式后再在UI线程执行耗时操作就不会崩溃, 而是在日志输出错误, 方便开发者调试

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()
        .permitAll()
        // .penaltyLog()
        .build());

但是这个功能被我滥用了, 旧版本的桌面小部件获取新冠肺炎数据就是在主线程进行的, 为了不崩溃我就开启了严格模式, 这种做法是完全错误的!
新版本已改为在新线程上执行网络操作, 主线程等待, 直到超时或返回数据

Android 3.0 起, 点击小部件默认会跳转至应用主Activity

详见: https://developer.android.google.cn/guide/topics/appwidgets/host#which-version-are-you-targeting

通过对Android源码的阅读, 发现桌面小部件的点击是在下列方法中被处理的
android.appwidget.AppWidgetHostView#onDefaultViewClicked
因此最终想到一个办法, 即为根布局设置点击事件, 发送一个空广播 我可真机智(

Android 8.0 后台限制, 隐式广播无法正常工作

详见: https://www.jianshu.com/p/5283ebc225d5

在 Activity 之外 startActivity

在Activity之外startActivity时必须用FLAG_ACTIVITY_NEW_TASK参数
详见: android.app.ContextImpl#startActivity(android.content.Intent, android.os.Bundle)

访问隐藏接口

Android里有很多被标记为hide的方法, 这些方法对于外部是不可见的, 即便是反射调用也无效, 可以通过adb允许它们被调用

详见: https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
如需允许访问非 SDK 接口,请使用以下 adb 命令:
adb shell settings put global hidden_api_policy 1
如需将 API 强制执行策略重置为默认设置,请使用以下命令:
adb shell settings delete global hidden_api_policy


PS: 全都是在开发桌面小部件时踩的坑(

标题: Android应用开发笔记(1)
作者: QingChenW
链接: https://dawncraft.cc/2021/04/100/
本文遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可
禁止商用, 非商业转载请注明作者及来源!
上一篇
下一篇
隐藏