请教一个 android 生命周期的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
qwertyegg
V2EX    程序员

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

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

    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     Solana     2404 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:16 PVG 09:16 LAX 18:16 JFK 21:16
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86