问一个安卓开发相关的问题

2019-11-12 10:12:04 +08:00
 Vegetable

我不是安卓开发,但是有些好奇这个机制↓:

在抖音里边,我从某一个账号开始,查看他的粉丝,选中一个粉丝继续查看这个选中粉丝的粉丝.

这样我可以一直打开新的页面,点击返回的话,会回到上一个页面,那这些历史记录是怎么处理的呢?

如此往复下去可以打开足够多的个人详情页面导致 app 崩溃吗? 还是说那些页面会被回收掉,只保存了一个路径而已?

7151 次点击
所在节点    Android
29 条回复
Vegetable
2019-11-12 10:18:49 +08:00
嗯..验证了一下好像是会,几十个之后好像是会黑屏,复现不是很稳定.
llcfays
2019-11-12 10:20:02 +08:00
Android 是栈视图,另外也可以设置[启动模式]( https://blog.csdn.net/mynameishuangshuai/article/details/51491074)的。
751762476
2019-11-12 10:20:05 +08:00
Edward4074
2019-11-12 10:20:59 +08:00
页面会被回收,但页面中 View 的状态会被保留,页面对应的数据需要开发人员在对应的回调里处理才能保留
Mrxxy
2019-11-12 10:21:32 +08:00
Android 中每个 Activity 即界面,会被放在一个栈中
https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=zh-CN
tongyang
2019-11-12 10:31:37 +08:00
一般安卓的 app 不会做处理的,你这属于极端现象
Vegetable
2019-11-12 10:34:39 +08:00
@llcfays
@751762476
@Edward4074
@Mrxxy
感谢各位,看明白啦
fhvch
2019-11-12 10:38:13 +08:00
一般来说 Android 中你看到每一个页面都是一个 activity 组件(也有可能是 fragment/view )
如果是 activity 的话,Android 中 activity 是通过 栈(先进后出) 这种数据结构去存储的
一般情况下,也就你看到的那种情况就是每次你点击一次粉丝 都会去生成一个新的 activity 然后存到 栈顶,也就是我们能够看到的~( 2 楼有说还有其它的启动 activity 的模式)
如果真的是我说的这样子的话,每次都去启动一个新的 activity 不去做一些处理的话确实是会有问题的,启动几十个甚至上百的时候,很有可能会内存溢出导致 crash...
raiz
2019-11-12 11:18:17 +08:00
社交软件都会遇到这个问题, 表现由交互和稳定性妥协,开发者通过设置 Activity 的启动模式,可以决定上一个 activity 留不留在返回栈里,如果留,那么会出现你说的问题(测试会报内存泄漏),不留的话,用户可能会丢失路径。
wvitas
2019-11-12 11:29:05 +08:00
启动模式了解下
Goolge
2019-11-12 16:17:23 +08:00
监听 activity 生命周期 超过 N 个 finish 之前的 为了防止占用大量内存。具体你怎么处理看情况。
charlieputon
2019-11-12 16:49:24 +08:00
这种情况应该使用 single top 启动模式来启动 activity
ukyoo
2019-11-12 17:18:21 +08:00
这和启动模式有啥关系啊...很常见的情况就是商品详情页通过相似商品无限开下去, 最后肯定会 OOM 的
BigDogWang
2019-11-12 17:22:12 +08:00
@fhvch 没有内存泄漏的话是不会崩溃的。后台活动在内存不足的情况下是会回收掉的
BigDogWang
2019-11-12 17:24:03 +08:00
为啥这帖子里这么多人在误导。如果你没有内存泄漏的话,后台 Activity 过多是不会导致 OOM 的
DeweyReed
2019-11-12 18:05:39 +08:00
请问有什么办法可以最效率地保存这个历史路径吗?
jjhappyforever
2019-11-12 18:43:54 +08:00
首先打开足够多的页面是会被回收的,页面回收机制是由系统控制的,APP 本身只不过是一直 new Activity,单个 Activity 占有内存很少的,所以不停的 new 也无所谓,但假如你真的开启页面过度,导致栈底端一些页面被回收了,也只是将回收数据持久化到本地,待你返回在通过 Bundle 恢复数据而已.所以开启页面过多导致 crash 概率几乎为 0.系统分配给 APP 内存有临界值,内存溢出是内存使用不当造成的,如图片,大文件等,但开启页面的 Activity 机制,安卓系统是绝对不会让之内存不足而 crash 的.
janus77
2019-11-12 19:18:56 +08:00
会爆栈
如果需要处理的话,就跟代码的单例一样,永远只有一个页面。
fhvch
2019-11-12 19:51:06 +08:00
@BigDogWang activity 对象是绝对的强引用!这种级别的引用就算是 app 再怎么内存不足也不会去回收的!
ukyoo
2019-11-12 19:56:53 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/618686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX