Android Activity之间跳转出现短暂黑屏的处理方法和intent.setFlags方法中的参数值含义

在默认情况下,Android应用程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初 始化列表数据、向服务器发送请求获取数据等等。同样,使用startActivity(intent)方法从一个Activity进入到新的 Activity时,这个过程中也会出现短暂的黑屏。这个问题的存在是由Android应用框架决定的,但的确很影响用户体验。下面就动手来解决这个黑屏 问题!


在activity标签中加入
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  有时候这样设置为全屏也不好使。下边就自定义了

第一步:自定义Theme(主题)

在your_project/res/values/styles.xml中加入自定义Activity的Theme,如下所示:

<?xml version="1.0" encoding="utf-8"?>
 <resources>     
 <!-- Activity主题 -->     
 <style name="activityTheme" parent="@android:style/Theme">         
 <item name="android:windowIsTranslucent">true</item>     
 </style> 
 </resources>

其中<item name="android:windowIsTranslucent">true</item>的意思是设置目标 Activity(要启动的那个Activity)是透明的。很容易理解,两个Activity,A和B;在A中启动B,因为B是透明的,看到的背景仍是 A,这样就解决了这个短暂的黑屏问题。

第二步:修改Manifest,将Theme应用到目标Activity上

定义好Theme后,就该为对应的Activity绑定Theme了。这个代码主要在Manifest中实现,在Activity中加上以下属性:

<activity android:name=".activity.BookActivity"        
android:theme="@style/activityTheme" />

做了以上操作即可。



一. intent.setFlags()方法中的参数值含义:

1.FLAG_ACTIVITY_CLEAR_TOP例如现在的栈情况为:A B C D 。D此时通过intent跳转到B,如果这个intent添加FLAG_ACTIVITY_CLEAR_TOP标记,则栈情况变为:A B。如果没有添加这个标记,则栈情况将会变成:A B C D B。也就是说,如果添加了FLAG_ACTIVITY_CLEAR_TOP标记,并且目标Activity在栈中已经存在,则将会把位于该目标activity之上的activity从栈中弹出销毁。这跟上面把B的Launch mode设置成singleTask类似。简而言之,跳转到的activity若已在栈中存在,则将其上的activity都销掉。

2.FLAG_ACTIVITY_NEW_TASK:例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。注意如果试图从非activity的非正常途径启动一个activity(例见下文“intent.setFlags()方法中参数的用例”),比如从一个service中启动一个activity,则intent比如要添加FLAG_ACTIVITY_NEW_TASK标记(编者按:activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈,所以要新起一个栈装入启动的activity)。简而言之,跳转到的activity根据情况,可能压在一个新建的栈中。

3.FLAG_ACTIVITY_NO_HISTORY:例如现在栈情况为:A B C。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,则此时界面显示D的内容,但是它并不会压入栈中。如果按返回键,返回到C,栈的情况还是:A B C。如果此时D中又跳转到E,栈的情况变为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。简而言之,跳转到的activity不压在栈中。

4.FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch mode的singleTop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么将不会新建一个实例压入栈中。简而言之,目标activity已在栈顶则跳转过去,不在栈顶则在栈顶新建activity。

二.intent.setFlags()方法中参数的用例:

很多人使用startActivity时候,会碰到如下的异常:
Caused by: Android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
都知道,Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task(编者按:参见一.2.的编者按),遇到上面那个异常的,都是因为使用了Context的startActivity方法。解决办法是:Java代码中加一个flag,即intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。这样就可以在新的task里面启动这个Activity了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Intent.setFlags()` 方法用于设置 `Intent` 的标志(flags),这些标志可以影响 `Intent` 的行为和启动方式。以下是常见的标志参数及其含义: 1. `Intent.FLAG_ACTIVITY_NEW_TASK`:将目标 `Activity` 启动在一个新的任务栈。如果当前没有任务栈存在,将创建一个新的任务栈。 2. `Intent.FLAG_ACTIVITY_CLEAR_TASK`:启动一个新的任务栈,并且清除所有该任务栈的现有实例。这个标志通常与 `FLAG_ACTIVITY_NEW_TASK` 一起使用。 3. `Intent.FLAG_ACTIVITY_SINGLE_TOP`:启动模式为 `singleTop`,表示如果目标 `Activity` 已经位于栈顶,那么不会创建新的实例,而是会调用目标 `Activity` 的 `onNewIntent()` 方法处理新的 `Intent`。 4. `Intent.FLAG_ACTIVITY_CLEAR_TOP`:如果目标 `Activity` 已经在任务栈存在,将会将其之上的所有实例都关闭,使得目标 `Activity` 成为栈顶。这个标志通常与 `FLAG_ACTIVITY_SINGLE_TOP` 一起使用。 5. `Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS`:启动的 `Activity` 不会出现在最近使用的应用列表(Recent Apps)。 6. `Intent.FLAG_ACTIVITY_NO_HISTORY`:启动的 `Activity` 不会保留在返回堆栈,即按下返回键时不会返回该 `Activity`。 这只是一些常见的标志参数,还有其他更多的参数可以用于特殊的需求。你可以通过使用 `Intent.FLAG_` 前缀来查看可用的标志选项。 注意:标志参数可以通过使用按位或(`|`)运算符进行组合,例如:`intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP)`。 请注意,在使用这些标志时要谨慎,确保理解其含义并根据需要正确使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值