美文网首页
startActivity()拾遗

startActivity()拾遗

作者: 转岗做JAVA | 来源:发表于2021-06-22 10:28 被阅读0次
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操作。

相关文章

网友评论

      本文标题:startActivity()拾遗

      本文链接:https://www.haomeiwen.com/subject/ccldyltx.html