android在xml里使用singleTask或者代码里使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK出现黑屏问题

使用场景是这样的,我从主页往后点击了四个页面,在第四个页面,我需要直接回退到主页,这里就需要使用到安卓的activity启动模式来做了,我选择使用了singleTask
栈内复用模式:这是一种单实例模式,一个栈中同一个Activity只存在唯一一个实例,无论是否在栈顶,只要存在实例,都不会重新创建,和 singleTop 一样会重新调用 onNewIntent 方法。需要注意的是:如果一个Activity被设置为singleTask模式,那么当栈内已经存在该Activity实例时,再启动该Activity,会让该Activity实例之上的Activity被出栈。举个例子:有四个Activity 分别是 A、B、C和D,A是singleTask模式,当先执行A->B->C->D时,A在栈内已存在实例,此时再调用D->A启动A时,会让A实例之上的B、C、D都出栈。一般项目的MainActivity都设置为此模式,方便放回首页和清空中间Activity。
启动模式类别
标准模式(standard)
栈顶复用模式(singleTop)
栈内复用模式(singleTask)
单例模式(singleInstance)

  1. 启动模式的设置
    启动模式有2种设置方式:在AndroidMainifest设置、通过Intent设置标志位
    xml
    2.1 在AndroidMainifest设置
    在AndroidMainifest的Activity配置进行设置
<activity 
    android:name="com.demo.Main4Activity"
    //通过android:launchMode属性设置
    android:launchMode="singleTask"/>

2.2通过Intent设置标志位

标记位属性 含义
FLAG_ACTIVITY_SINGLE_TOP 指定启动模式为栈顶复用模式(SingleTop)
FLAG_ACTIVITY_NEW_TASK 指定启动模式为栈内复用模式(SingleTask)
FLAG_ACTIVITY_CLEAR_TOP 所有位于其上层的Activity都要移除,SingleTask模式默认具有此标记效果

在AndroidMainifest的Activity配置进行设置

Intent inten = new Intent (ActivityA.this,ActivityB.class);
//通过Intent的Flag设置
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); 

黑屏问题
关于跳转的时候出现黑屏问题
可是使用的时候,我发现会有一段黑屏的时间段(非常短。可是能非常明显感觉出来)。
我试着把intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);这行代码去掉或者把清单文件里的android:launchMode="singleTask"去掉,发现黑屏就不见了。为了測试,使用其它的flag。如FLAG_ACTIVITY_CLEAR_TOP等均没有发生黑屏的情况,可是依据需求我又必需要使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK。后来经过自己的查找和測试,发现通过以下的方法能够去掉黑屏。
与activity引用的style有关系

修改后为

   <style name="Theme.Preference.DayNight" parent="Theme.DayNight">
        <item name="android:windowDisablePreview">true</item>
    </style>

也就是加上true。能够去掉之前所出现的黑屏。
参考:
https://www.jianshu.com/p/7e70ee765513
https://www.codeleading.com/article/51971534617/

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...