V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qwertyegg
V2EX  ›  程序员

请教一个 android 生命周期的问题

  •  
  •   qwertyegg · 2020-11-03 14:32:56 +08:00 · 827 次点击
    这是一个创建于 394 天前的主题,其中的信息可能已经有所发展或是发生改变。

    app 有一个门帘 ActivityOne,会进行一些初始化工作,完成后会进入 app 的主要 Activity,名叫 ActivityTwo

    如果在这时,把程序放入后台,长时间的休眠后,回到这个 app,会回到 ActivityTwo

    在此时如果我用后退键,会回到 ActivityOne

    我的问题是,因为长时间休眠,ActivityOne 会再次调用 onCreate(),我的理解是 ActivityOne 因为休眠被系统干掉了。我有一段初始化的代码,是在 ActivityOne 的 onCreate()里面运行的,可是很显然,我并不希望在 app 从后台唤醒后再次运行这段初始化的代码

    我该怎么办呢?

    10 条回复    2020-11-04 10:30:39 +08:00
    qwertyegg
        1
    qwertyegg  
    OP
       2020-11-03 14:45:23 +08:00
    查了下资料,是不是我在 onCreate()里面检查 savedInstanceState != null 就可以判断这个 ActivityOne 是被系统销毁后重新造的。
    MaL
        2
    MaL  
       2020-11-03 15:39:57 +08:00 via Android
    ActivityOne 用不到了,不调 finish()么?
    hikari2
        3
    hikari2  
       2020-11-03 16:54:14 +08:00
    什么手机,有的手机启动程序的时候只启动你的程序,然后你的程序根据你的 manifest 启动你的 LAUNCHER Activity,有的手机会找到你的程序的 LAUNCHER Activity,然后启动你的 activity,这两个从现象上没什么区别。这个是我满满摸索发现的。
    kiroter
        4
    kiroter  
       2020-11-03 18:44:41 +08:00
    finish
    qwertyegg
        5
    qwertyegg  
    OP
       2020-11-04 00:45:33 +08:00
    @MaL
    @kiroter

    谢谢回复,ActivityOne 并非用不到,因为正常情况下,从 ActivityOne 切换到 ActivityTwo 后,希望 ActivityOne 会在 Activity Stack 上(不知道这么说对不对)。这时可以按 back 键回到 ActivityOne.而从睡眠中唤醒后(此时在 ActivityTwo),按了 back 键也会回到 ActivityOne,但是观察到 ActivityOne 已经被系统销毁,所以会重新调用 onCreate()。

    我查到的办法是用 savedInstanceState != null 是否被系统销毁,然后在 onCreate()里面判断是否重新初始化。finish()按照开发文档说法是不需要 ActivityOne,需要将其关闭的时候调用。
    qwertyegg
        6
    qwertyegg  
    OP
       2020-11-04 00:47:17 +08:00
    @hikari2 谢谢指导,手机是 pixel 3a,我的问题不在于启动程序,而是迷惑于程序在后台被唤醒后(还被杀了 Activity)的行为。
    devfeng
        7
    devfeng  
       2020-11-04 04:03:09 +08:00 via Android
    想不到这是啥场景。你 back 回到 activityone,再自动跳到 activitytwo 吗
    qwertyegg
        8
    qwertyegg  
    OP
       2020-11-04 04:14:01 +08:00
    @devfeng 那段初始化代码会自动跳到 ActivityTwo 。当我用 back 按键从 ActivityTwo 回到 ActivityOne 的时候,并不想重新初始化
    whenwind
        9
    whenwind  
       2020-11-04 09:41:28 +08:00   ❤️ 1
    Activity 最好不要作为流程的控制和记录来使用,因为你永远不知道系统会在什么时候给你杀掉。
    如果有需要用到类似跳过 ActivityOne 直达 ActivityTwo 的话我会用 Service,Activity 的行为以 Service 上储存的数据为准,ActivityOne 在询问 Service 已经初始化过了就不执行初始化代码直接进入 ActivityTwo,休眠回来 ActivityTwo 按下返回键询问 Service,如果已经执行过初始化就不执行返回。
    如果不希望使用 Service 的话那把部分初始化代码放在 ActivityTwo 的 onCreate 呢?
    demo06
        10
    demo06  
       2020-11-04 10:30:39 +08:00
    你在 1 里面跳转 代码后面加个 finish(),貌似 2 就不会再返回 1 了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3955 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    ♥ Do have faith in what you're doing.