androidactivity设置
A. Android中的Activity详解--启动模式与任务栈
目录
activity的简单介绍就不写了,作为最常用的四大组件之一,肯定都很熟悉其基本用法了。
首先,是都很熟悉的一张图,即官方介绍的Activity生命周期图.
情景:打开某个应用的的FirstActivity调用方法如下:
由于之前已经很熟悉了,这里就简单贴一些图。
按下返回键:
重新打开并按下home键:
再重新打开:
在其中打开一个DialogActivity(SecondActivity)
按下返回:
修改SecondAcitvity为普通Activity,依旧是上述操作:
这里强调一下 onSaveInstanceState(Bundle outState) 方法的调用时机:
当Activity有可能被系统杀掉时调用,注意,一定是被系统杀掉,自己调用finish是不行的。
测试如下:FirstActivity启动SecondActivity:
一个App会包含很多个Activity,多个Activity之间通过intent进行跳转,那么原始的Activity就是使用栈这个数据结构来保存的。
Task
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.
即若干个Activity的集合的栈表示一个Task。
当App启动时如果不存在当前App的任务栈就会自动创建一个,默认情况下一个App中的所有Activity都是放在一个Task中的,但是如果指定了特殊的启动模式,那么就会出现同一个App的Activity出现在不同的任务栈中的情况,即会有任务栈中包含来自于不同App的Activity。
标准模式,在不指定启动模式的情况下都是以此种方式启动的。每次启动都会创建一个新的Activity实例,覆盖在原有的Activity上,原有的Activity入栈。
测试如下:在FirstActivity中启动FirstActivity:
当只有一个FirstActivity时堆栈情况:
此种模式下,Activity在启动时会进行判断,如果当前的App的栈顶的Activity即正在活动的Activity就是将要启动的Activity,那么就不会创建新的实例,直接使用栈顶的实例。
测试,设置FirstActivity为此启动模式,多次点击FirstActivity中的启动FirstActivity的按钮查看堆栈情况:
(其实点击按钮没有启动新Activity的动画就可以看出并没有启动新Activity)
大意就是:
对于使用singleTop启动或Intent.FLAG_ACTIVITY_SINGLE_TOP启动的Activity,当该Activity被重复启动(注意一定是re-launched,第一次启动时不会调用)时就会调用此方法。
且调用此方法之前会先暂停Activity也就是先调用onPause方法。
而且,即使是在新的调用产生后此方法被调用,但是通过getIntent方法获取到的依旧是以前的Intent,可以通过setIntent方法设置新的Intent。
方法参数就是新传递的Intent.
1.如果是同一个App中启动某个设置了此模式的Activity的话,如果栈中已经存在该Activity的实例,那么就会将该Activity上面的Activity清空,并将此实例放在栈顶。
测试:SecondActivity启动模式设为singleTask,启动三个Activity:
这个模式就很好记,以此模式启动的Activity会存放在一个单独的任务栈中,且只会有一个实例。
测试:SecondActivity启动模式设为singleInstance
结果:
显然,启动了两次ThirdActivity任务栈中就有两个实例,而SecondActivity在另外一个任务栈中,且只有一个。
在使用Intent启动一个Activity时可以设置启动该Activity的启动模式:
这个属性有很多,大致列出几个:
每个启动的Activity都在一个新的任务栈中
singleTop
singleTask
用此种方式启动的Activity,在它启动了其他Activity后,会自动finish.
官方文档介绍如下:
这样看来的话,通俗易懂的讲,就是给每一个任务栈起个名,给每个Activity也起个名,在Activity以singleTask模式启动时,就检查有没有跟此Activity的名相同的任务栈,有的话就将其加入其中。没有的话就按照这个Activity的名创建一个任务栈。
测试:在App1中设置SecondActivity的taskAffinity为“gsq.test”,App2中的ActivityX的taskAffinity也设为“gsq.test”
任务栈信息如下:
结果很显然了。
测试:在上述基础上,在ActivityX中进行跳转到ActivityY,ActivityY不指定启动模式和taskAffinity。结果如下:
这样就没问题了,ActivityY在一个新的任务栈中,名称为包名。
这时从ActivityY跳转到SecondActivity,那应该是gsq.test任务栈只有SecondActivity,ActivityX已经没有了。因为其启动模式是singleTask,在启动它时发现已经有一个实例存在,就把它所在的任务栈上面的Activity都清空了并将其置于栈顶。
还有一点需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由于SecondActivity并没有指定MAIN和LAUNCHER过滤器,故在FirstActivity跳转到SecondActivity时,按下home键,再点开App1,回到的是FirstActivity。
大致就先写这么多吧,好像有点长,废话有点多,估计也有错别字,不要太在意~~~
B. android怎么设置activity为对话框模式
将activity设置成对话框样式,只需在activity属性里面增加下面一句代码:
然后可以activity左边增加一个小图片,让它更像dialog,代码如下:
但是上面的设置往往还不能满足实际需求,因为样子、背景和一些属性使用的默认的,下面使用style自定义一个,以后可以根据实际需要自行更改:
C. Android UI开发中,设置Activity的什么属性可以使Activity显示为对话框样式.
将activity设置成对话框样式,只需在activity属性里面增加下面一句代码:
D. android 里如何设置Activity标题的背景
设置Android的Activity标题的背景是有多种方法的
首先最简单的是直接在布局里面设置个background
其中background是可以直接使用颜色或者图片或者是自定义的形状
还有就是可以利用Android:theme 自带的主题背景设置
设置theme更改主题背景
下面是自带的theme说明文档
Android应用开发——系统自带样式Android:theme
•android:theme="@android:style/Theme.Dialog"将一个Activity显示为能话框搜握模式
•android:theme="@android:style/Theme.NoTitleBar"不显示应用程序标题栏
•android:theme="@android:style/Theme.NoTitleBar.Fullscreen"不显示应用程序标题栏,并全屏
•android:theme="Theme.Light"背景为白色
•android:theme="Theme.Light.NoTitleBar"白色背景并无标题栏
•android:theme="Theme.Light.NoTitleBar.Fullscreen"白色背景,无标题栏,全屏
•android:theme="Theme.Black"背景黑色
•android:theme="Theme.Black.NoTitleBar"黑色背景并无标题栏
•android:theme="Theme.Black.NoTitleBar.Fullscreen"黑色背景,无标题栏,全屏
•android:theme="Theme.Wallpaper"用系统桌面为应用程序背迅游景
•android:theme="Theme.Wallpaper.NoTitleBar"用系统桌面为应用程序背景,且无标题栏
•android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"用系统桌面为应用程序背景,无标题栏,全屏
•android:theme="Translucent"
•android:theme="Theme.Translucent.NoTitleBar"
•android:theme="Theme.Translucent.NoTitleBar.Fullscreen"
•android:theme="世昌庆Theme.Panel"
•android:theme="Theme.Light.Panel"
下面看看具体的布局代码
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:layout_gravity="center"
android:orientation="vertical"
android:background="@drawable/bkg_img_default">
<!--使用图片来改变布局背景-->
效果
java">//这个去除标题的代码一定要加载布局文件之前
requestWindowFeature(Window.FEATURE_NO_TITLE);
E. android里面有多个activity如何设置一个为主界面上的activity
答:首先打开AndroidManifest.xml配置文件,在AndroidManifest.xml里修改
找到activity标签,添加如下内容
<activity
android:name=".CdBusSearchActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".BusInfoActivity"/>
F. android里面有多个activity如何设置一个为主界面上的activity
在Application标签下配置
<activity
android:name=".XXXActivity"
android:label="@string/XXXName">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
应用启动的时候就会进入XXXActivity。最要是要在activity 里设置 <category android:name="android.intent.category.LAUNCHER" />
G. Android设置Activity背景为透明style的方法
1.设置Theme.Translucent
只需要在Manifest中需要透明的Activity内设置theme为以上任意一个就可以了
2.在Activity的layout.xml文件中,设置父布局背景透明度(不设置背景色默认全透明),不设置透明度看不出效果,如果子控件设置了背景色且不透明,则子控件所占位置无透明效果。
3.效果图
1.使用自定义的Theme
2.在res-values-styles.xml中添加MyTransparent
3.在res-values-colors.xml中添加透明颜色值
4.以上步骤设置完成和方法一有同样的效果,省去了在layout.xml设置透明背景色(如果在布局中页设置了背景色,将以布局中的为准)。方法二相对灵活一点,可以多设置一些属性,如模糊背景: