startActivity()拾遗
2021-06-22 本文已影响0人
转岗做JAVA
1. taskAffinity
- 每个Activity都有一个taskAffinity属性,默认为当前应用的包名;
- 一定程度上也会影响任务栈的调配流程,但单独使用无效;
- 一个在后台任务栈中Activity A(A的allowTaskReparenting=true),当有其他Activity进入前台,并且taskAffinity与A相同,则会自动将A添加到当前启动的任务栈顶;
2. 通过Binder传递数据的限制
通常情况下大小会限制为1M,不同厂商定制后会有不同,超过限制大小会造成程序崩溃,举例:
Intent intent = new Intent(this, A.class);
intent.putExtra("bean", new Bean()); //传递Bean中的数据
startActivity(intent);
static class Bean implements Serializable {
private byte[] data = new byte[1024 * 1024];
String str = "data string";
}
解决办法:
- 减少通过Intent传递的数据,将非必须字段使用transient关键字修饰;
- 将对象转化为JSON字符串,减少数据体积;
- 使用其他方式传递数据,比如使用本地持久化实现数据共享,或者使用EventBus实现数据传递;
Binder机制详解参考:
https://blog.csdn.net/luoshengyang/article/details/6629298
https://www.jianshu.com/p/adaa1a39a274
3. process造成多个Application
解决办法:
- onCreate方法中判断进程的名称,只有在符合要求的进程里,才执行初始化操作;
- 抽象出一个与Application生命周期同步的类,并根据不同的进程创建相应的Application实例;
更多详细介绍可参考这篇文章:https://conorlee.top/2017/02/21/Multi-Process-Dispatch/
4. 后台启动Activity失效
从Android 10(API 29)开始,Android系统对后台启动Activity做了一定的限制,官方建议使用通知来替代直接启动Activity操作。