问题:播放视频,然后在播放收音机,此时视频进入后台
现象:收音机界面中,弹出视频应用跳转时的提示
分析:
为了各个应用跳转时,不会闪黑屏,所有主题会继承android:Theme.Translucent.NoTitleBar。
收音机应用中调用的主题继承android:Theme.Translucent.NoTitleBar,分析发现主题中包含Translucent会影响activity的生命周期
导致在后台中运行的应用中activity没有执行onstop()方法,于是导致视频播放界面中在onstop()方法中逻辑未及时执行,视频界面
还未销毁,而视频播放信息发生变化时,在收音机界面会弹出视频应用的提示。
于是,修改了收音机的主题为android:Theme.Holo.NoActionBar,从视频进入收音机界面时,虽然会闪黑屏,但是视频后台时,执行了
onstop()方法,不会再出现在收音机界面弹其他应用的问题了。
延伸:
/*****************************************************************************************************************************************************/
后来,在网上查看相关资料,发现设置透明主题,或者定义style属性,可以达到不出现黑屏的效果,但是会影响activity的生命周期和
界面绘制时间长短。
1.设置android:windowBackground属性,在界面跳转时,会出现windowBackground定义的界面
2.设置 android:windowIsTranslucent属性
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>//背景是透明的
<item name="android:windowIsTranslucent">true</item>//这里设置了半透明
<item name="android:windowBackground">@android:color/transparent</item>
设置android:windowIsTranslucent 主题是为了处理启动App看见的黑屏,确实是可以处理的,但是在界面跳转时,可能会延时1到2秒
给人程序启动慢的感觉,界面会一次性刷出来,刷新同步。
然后按home键, 然后从最近任务列表中,点击进入这个activity。
然后再点击 back界面返回时, 其实是退出这个应用了,然后会闪屏一下,闪屏一下最近任务列表
这个是由于 设置了此属性后, 进入这个activity的 上一个activity 没有执行 onstop 方法所引起的
去掉android:windowIsTranslucent之后,改为
背景是张logo图片,这种方式比较好,点击桌面图标.0~1秒就看见了Logo界面.给人程序启动快的感觉,界面先显示背景图,
然后再刷新其他界面控件,刷新不同步。
<item name="android:windowBackground">@drawable/logo</item>
/*****************************************************************************************************************************************************/
/*****************************************************************************************************************************************************/
在一个activity中, 在代码中动态修改actionbar和 状态栏的颜色
说真的为什么要用 actionbar。感觉难用死了,而且是改bug 基本要求在原代码基础上不变进行修改,如果添加自定义actionbar 自定义view 啥的又感觉好麻烦
一 、现状
1.默认是设置了activity 启动的style
里面包括 状态栏的显示效果,actionbar或自定义多toolbar等的显示效果,)
2. 根据需求在变幻动画后,界面需要变化 需要修改等属性,因为为了适配下一个界面的效果(需求)
二、解决:
2.0 这里再重申下之前不同版本的要求状态栏和app风格一致的设置方式
4.4 -5.0 设置的透明状态栏(布局xml中也要设置)
values-v19/style.xml
<style name="XXXX" parent="Theme.XXXX">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
5.0以上 (当statusBarColor 和 colorPrimary 2个属性同时存在的话,状态栏的颜色是根据statusBarColor属性走的)
values-v21/style.xml
当你的主题继承的是 普通的 就设置 当statusBarColor 就好了
<style name="XXX" parent="XXXX">
<item name="android:windowTranslucentStatus">false</item>
<!-- 其实为了适配的话这里就设置false 下面设置颜色比较好-->
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x 把颜色设置透明 , 或者直接设置状态栏的颜色与app风格一致也可以-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
如果继承的是 Material 风格的主题
@android:style/Theme.Material (dark version)
@android:style/Theme.Material.Light (light version)
@android:style/Theme.Material.Light.DarkActionBar
与之对应的AppCompatTheme:
Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar
<item name="colorPrimary">@android:color/holo_blue_bright</item>
<item name="colorPrimaryDark">@android:color/holo_blue_bright</item>
2.1 修改状态栏 6.0 (这次需求的重点)
(1)代码中设置状态栏颜色
Window window = this.getWindow();
window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(this.getResources().getColor(R.color.TCT_colorPrimary));
/*****************************************************************************************************************************************************/