美文网首页
Android启动页重复启动

Android启动页重复启动

作者: the_Zhang | 来源:发表于2020-11-29 23:24 被阅读0次

Android启动页重复启动

[toc]

1.问题描述

​ 在做项目的时候,发现自己做的App在运行过程中,点击Home键或者Back键回到桌面时,这个时候再点击App启动图标,会再显示一遍启动页(SplashActivity),然后进入到App主界面(HomeActivity)。但实际上我想要的效果是和其他App一致的,就是在App没有被结束掉,然后点击启动图标会进入到退出前的显示界面。流程图大概如下所示。

  • 项目中的效果
graph LR
A[HomeActivity] --> B[点击Home/Back键回到桌面] --> C[点击App启动图标] --> D[SplashActivity] --> E[HomeActivity]
  • 实际想要的效果
graph LR
A[HomeActivity] --> B[点击Home/Back键回到桌面] --> C[点击App启动图标] --> D[HomeActivity]

2.核心原因

​ 在桌面点击App启动图标的时候,首先是会启动SpalshActivity的,因为SplashActivity被设置成了启动的Actively。

​ 点击Back键后,如果没有重写onBackPressed方法,Activity就会被Finish掉,在HomeActivity这个界面,点击Back键就会退出应用,所以再从桌面点击App启动图标,App会重新启动。

​ 点击Home键后,当前的Activity不会被Finish掉,会调用onPause和onStop方法。

在项目中,SplashActivity的launchMode设置的是standard,HomeActivity的launchMode设置的是SingleTask。点Home键回到桌面后,这个时候点击App启动图标,实际上是启动了SplashActicvity,一般在显示完启动页之后通常会Finish掉,也就是会从任务栈中移除。显示完启动页后进入到HomeActivity,由于之前该应用的任务栈中还存在HomeActivity,而HomeActivity的lanuchMode是SingleTask,也就是会将任务栈中其他的Activity给移除掉。

3.解决步骤

​ 知道了几个关键点之后,逐一解决这些问题。

  1. 是否需要显示SplashActivity

    实际上,如果当前App的任务栈中不为空,我们是希望SplashActivity不显示的,那就在SpalshActivity显示之前Finish掉就好了,加入如下代码。

    class SplashActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            if (!this.isTaskRoot) {
                if (intent != null) {
                    val action = intent.action
                    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN == action) {
                        finish()
                        return
                    }
                }
            }
        }
    }
    

    ​ 首先是判断当前Actitvity是否在栈顶,如果是,表示第一次启动,否则表示被启动过。在finish方法后加上return是为了避免执行SplashActivity后续的操作,比如获取配置信息或者其他,具体需要看项目的需求。

  2. 重写HomeActivity中的onBackPressed方法

    在HomeActivity中加入如下代码。

     class HomeActivity : AppCompatActivity() {
         override fun onBackPressed() {
             moveTaskToBack(true)
        }
     }
    

    moveTaskToBack()方法表示将该Activity的任务移到任务栈的后面(此处解释有点不清楚,需要进一步了解),也就是不会finish掉该Activity。

4.总结

​ 其实解决该问题最重要的就是两点,是否显示SplshActivity以及点击Back键不结束掉Activity,解决了这两个问题基本上就完成了,还有重要的一点是设置Activity的launchMode。

 <activity
           android:name=".ui.activity.HomeActivity"
           android:launchMode="singleTask"
           android:screenOrientation="portrait" />
<activity
          android:name=".ui.activity.SplashActivity"
          android:screenOrientation="portrait"
          android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

参考文献

1.Android打release包时按Home键,再按桌面icon时出现app重新启动的问题

相关文章

网友评论

      本文标题:Android启动页重复启动

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