背景
针对平时开发过程中遇到的问题、bug、难点或知识点做一个归纳总结。
不定时更新。
学习地址
1. 网站
2. 博客
埋坑
1. Android 5.0 以下
View.getContext()强转Activity崩溃
直接继承 Activity 的 Activity 构造出来的 View.getContext() 返回的是当前 Activity。
但是:当 View 的 Activity 是继承自 AppCompatActivity,并且在 5.0 以下版本的手机上,View.getContext() 得到的并非是 Activity,而是 TintContextWrapper。
参考链接:
View.getContext() 一定返回 Activity 对象么?
每日一问:View.getContext() 一定会返回 Activity 对象么?
View.getContext() 里的小秘密
2. Android 6.0
运行时权限
敏感权限崩溃,例如拍照、文件读取等。
3. Android 7.0
文件访问权限 FileProvider
调用应用外文件崩溃,需要处理FileProvider。
4. Android 8.0
java.lang.IllegalStateException: Only fullscreen activities can request orientation
透明Activity在8.0设置了方向会崩溃,解决办法:
A. 不设置;
B. 清单文件android:screenOrientation="behind"。
5. Android 9.0
前台服务权限,无权限调用startForeground(int id, Notification notification)会崩溃
清单文件增加
6. 获取View截图没有文字
TextView不能设置singleLine,否则getDrawingCache和view.draw(canvas)无法获取文字。具体原因未知。
7. 根Activity不能设置singleTask
因为MainActivity是根Activity,所以不能在清单文件中设置singleTask,否则按Home键后点击icon启动应用时,不能返回原页面,只显示根Activity。
因为点击icon启动应用本质是Intent打开根Activity,如果设置singleTask会直接清除根Activity上面所有的页面。
如果部分情况需要清除根Activity以上所有页面,可以按以下实现:
/**
* startActivity
*
* @param context context
* @param pageID pageID
*/
public static void startActivity(Context context, int pageID) {
Intent intent = new Intent(context, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putInt(KEY_TYPE, pageID);
intent.putExtra(KEY_BUNDLE, bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
}
复制代码
8. Android端RSA加密密文服务端无法解密,服务端密文Android端解密有乱码
Cipher标准问题
服务端使用Cipher cipher = Cipher.getInstance("RSA");
Android端使用Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
参考链接:
解决Android客户端RSA解密出来的明文含有一堆乱码的问题
Android RSA加密 在服务端进行RSA解密不成功的问题
9. 点击通知栏无法打开Activity
步骤:
如果从快捷方式启动APP,那么,无论点多少次,都可以正常弹出activity;
如果通过返回键退出了APP,那么第一次通知到来可以正常弹出,第二次就没法弹出了。
解决:
启动Activity添加以下代码
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
复制代码
10. Inten分享文件Intent.ACTION_SEND微信发送没反应
Intent需要设置具体的Type,例如intent.setDataAndType(uri, "video/mp4");
11. Inten分享文件Intent.ACTION_SEND对话框点击没反应
目前发现在小米Redmi 4A / Andrid 6.0.1 / MIUI 8.5.6.0 ,发现是“后台弹出界面”权限问题,允许这个权限可以跳转了,但是在别的小米手机没有复现,而且微信也会出现这个问题,初步怀疑是MIUI系统Bug。
12. 导入aar包报错
报错信息:
ERROR: Unable to resolve dependency for ':app@developDebug/compileClasspath': Failed to transform file 'Unity-release.aar' to match attributes {artifactType=jar}
解决:
最后发现aar包中有文件名含有特殊字符,比如中文。
未完待续
小技巧
1. UiAutomator 查看手机当前页面UI层次Id等信息。可用于AccessibilityService
启动方法:
Android Studio - Terminal - uiautomatorviewer.bat 回车即可打开;
SDK路径\tools\bin\uiautomatorviewer.bat 双击即可打开。
2. Android根据路径获取文件信息
例如:根据路径获取音频、视频时长
可使用ContentResolver或MediaMetadataRetriever获取文件信息
/**
* 获取时长
*
* @param path path
* @return duration
*/
public static long getDuration(String path) {
MediaMetadataRetriever mmr = null;
try {
mmr = new MediaMetadataRetriever();
mmr.setDataSource(path);
return Long.parseLong(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
} catch (Exception e) {
// e.printStackTrace();
} finally {
if (mmr != null) {
mmr.release();
}
}
return 0;
}
复制代码
未完待续
知识点
0. 总结
1. 模块化开发
2. ANR原理、定位及解决
3. App优化
4. App安全
5. 对称加密/非对称加密算法
6. Android内存
7. static关键字
8. 四大组件
9. 多态
10. 多线程
11. 屏幕适配
12. Java创建对象的几种方式
13. 引用类型
14. 排序算法
15. 外部启动App、H5链接、系统分享列表增加自己的App等
16. MVC、MVP、MVVM
17. 事件分发
18. Handler
19. 多状态管理
20. RecyclerView
21. ActivityManagerService(AMS)
22. View绘制流程
23. 图片加载
24. 数据结构
25. 泛型
未完待续
零碎