今天开始讲Android的四大组件Activity、Service、Content Provider和Broadcast Receiver。下面从Activity开始讲起。
Android中一个activity就表示一个界面,往往一个APP都是由多个activity组成的。Android四大组件都要在配置文件中配置,否则运行程序时会包错。配置方法:
在AndroidManifest.xml配置文件中找到<application></application>节点,然后在里面添加<activity></activity>节点,如下:
<activity
android:name="com.example.activitytest1.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
该节点有一些比较重要的属性:
name:这个是必须要的,指定该activity所在的包名和类名,写法如例子所示,可能有时会看到有人这样写:android:name=".MainActivity"这个表示当前包名
下的MainActivity类
label:指定activity的名字
icon:指定activity的图标
theme:指定activity的主题
screenOrientation:指定activity显示的方式,landscape(横屏),portrait(竖屏)、unspecified(未指定,系统默认值)、nosensor(忽略物理感应器)、behind(继承activity栈当前activity下面的那个activity的值)
在Java代码中可使用setRequestedOrientation()方法改变该属性的值
launchMode:加载模式,该属性有四个取值,分别为standard、singleTop、singleTask、singleInstance。
先说一下Android对activity的管理方式:当我们启动一个Android应用时,系统会创建一个Task,可将它理解为一个栈,然后将启动的activity压入栈中。
standard:标准模式,系统默认值,表示每次启动该activity时都会新建一个实例,然后将其压入先前的栈中。
singleTop:这种模式基本与standart模式一样,但有一点不同,就是如果要启动的activity已经在栈定存在一个实例了,那它不会再新建一个实例,而是直接使用栈顶那个实例。
singleTask:这种模式保证在一个Task里只有一个activity实例,当启动该activity时,如果Task里不存在该对象实例,那么新建一个实例然后压入Task,如果已经存在了,那么再判断如果在栈顶,那么直接使用栈顶那个实例,如果不是在栈顶,那么先把栈里面的这个activity实例删掉,然后新建一个实例压入栈中。
singleInstance:启动activity时,如果已经存在,则将其所在的Task转到前台,如果不存在,则创建一个新的Task,然后创建一个该activity实例,然后雅图刚刚创建的Task中。
exported:设置为true时允许其他应用程序启动该activity
enabled:是否可以被实例化
Activity的生命周期图: