具有初始屏幕和应用程序对象的Android应用程序生命周期

时间:2018-03-08 10:12:51

标签: android android-activity kotlin lifecycle shutdown

我是Android开发中的新手,经过几个小时的测试,文档和论坛阅读后,我仍然无法管理和了解如何处理Android生命周期

让我们看一下我应用的活动流程(我觉得非常经典): 飞溅 - >登录 - >主

在启动画面中,我需要实例化并启动“购物”。对象,这将是我的应用程序的全局,并用于所有其他活动。 开始时间很长(大约10秒),因为需要服务器身份验证,数据下载和数据预处理。

每当应用程序“关闭”时,都应将其从最新应用中删除,并且必须关闭商店(客户要求) 如果应用程序重新启动,则需要返回启动活动并重新实例化商店

目前,我首先实施的内容如下:

// splash activity
private fun goToLogin() {
    runOnUiThread {
        startActivity(Intent(this, LoginActivity::class.java))
        finish()
    }
}

// login activity
private fun goToMain() {
    runOnUiThread {
        startActivity(Intent(this, MainActivity::class.java))
        finish()
    }
}

// in app class
fun quit(ctx: Activity) {
    ctx.finishAndRemoveTask()

    // close shop and kill app
    shop.close()
    android.os.Process.killProcess(android.os.Process.myPid())
}

它没有按预期工作: 首先,它不是一个Android goood实践:操作系统应该管理自己的应用程序关闭。 其次,即使申请被关闭,另一个似乎在被杀之后立即开始。 我添加了以下代码来演示:

// app onCreate()
override fun onCreate() {
    super.onCreate()

    Thread {
        while (true) {
            Thread.sleep(1000)
            log.info("APP RUNNING")
        }
    }.start()
}

我继续有#34; APP RUNNING"应用程序退出后在我的日志中(但在另一个Thread pid中)

所以我只是尝试删除killProcess()并让应用程序继续离开。 问题是,现在,当我重新启动应用程序时,我直接进入“登录”状态。活动,而不是泼水。 不知道为什么,我的清单看起来是正确的,并且在重新开始时,我按照预期进行飞溅活动。

    <activity
        android:name="com.thalesgroup.dk.mark.app.activities.SplashActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.thalesgroup.dk.mark.app.activities.LoginActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name="com.thalesgroup.dk.mark.app.activities.MainActivity"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar" />

因此,如果您对Android的良好实践和我的应用程序的方式有任何意见,我将不胜感激! 感谢

1 个答案:

答案 0 :(得分:0)

如果你没有在另一个线程中调用,那么首先你不需要runOnUiThread。

runOnUiThread {
        startActivity(Intent(this, LoginActivity::class.java))
        finish()
    }

究竟“商店必须关闭”,您是否必须向服务器发送请求以关闭商店?如果您没有发送请求,那么在应用程序终止时无需担心商店对象,它将被清除。但是,如果您必须手动清除它,则无法确定已杀死的应用程序。因为用户滑动应用程序时没有回调。如果用户在几分钟后什么都不做,并且在初始化请求时重新初始化,也许其中一个解决方案可以自行关闭它。 希望这会对你有所帮助。