Android xml application属性详解

做~自己de王妃 提交于 2019-11-29 09:23:45


例子:

<application
     android:allowClearUserData=["true" | "false"]
     android:allowTaskReparenting=["true" | "false"]
     android:backupAgent="string"
     android:debuggable=["true" | "false"]
     android:description="string resource"
     android:enabled=["true" | "false"]
     android:hasCode=["true" | "false"]
     android:icon="drawable resource"
     android:killAfterRestore=["true" | "false"]
     android:label="string resource"
     android:manageSpaceActivity="string"
     android:name="string"
     android:permission="string"
     android:persistent=["true" | "false"]
     android:process="string"
     android:restoreAnyVersion=["true" | "false"]
     android:taskAffinity="string"
     android:theme="resource or theme" >
     . . .
</application>

描述:

应用的声明。这个元素包含了子元素,这些子元素声明了应用的组件,元素的属性将会影响应用下的所有组件。很多属性为组件设置了默认值。有些属性设置了全局值并且不能被组件修改。

属性:

1、android:allowClearUserData

是否给以用户删除用户数据的权限,如果为true应用管理者就拥有清除数据的权限;false没有。默认为true。

2、android:allowTaskReparenting

应用定义的activities是否可以被从启动的任务转移到和他有相同并且将被带到前台的任务。true他们可以被转移,如果为false,他们必须和启动他们的任务保持在一起。默认为false。

主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关,必须是将该activity从旧的 taskAffinity迁移到新的taskAffinity中.只有设置了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标识才会用到该属性。从home上启动的程序都会设置该Flag,会进行task reset.

下面举个例子,有两个apk

apk1中含有个Activity:MainActivityA和ActivityB, ActivityB设置了allowTaskReparenting为false.
apk2中含有两一个activity:MainActivityB,MainActivityB点击的时候会启动ActivityB

首先我们启动apk2,进入MainActivityB,点击MainActivityB会进入ActivityB, 按home键,再从Home键启动apk1,用dumpsys工具得到这个时候的堆栈:

图中蓝色线框部分表示对应的Activity所属的task

可以看到,然从Home启动apk1的时候带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,但在任务重置的过程中什么事也没有做。 
我们把ActivityB的allowTaskReparenting改为true,这个时候前面的步骤一样,当我们从Home启动apk1时,我们惊奇的发现,启动的竟然是ActivityB,可以看到此时的堆栈:


这是由于重置任务的时候把它迁移到了新启动的task中。分析android源码中的resetTaskIfNeededLocked函数时就会明白这个是怎么回事了。

3、android:backupAgent

实现应用的备份代理的类名,BackupAgent的子类。这个属性的名称因该是全限定类名(如,"com.example.project.MyBackupAgent")。但是,如果名称的首字母被设置为点号,也可以为类名(如,".MyBackupAgent"),他将被追加到在<manifest>元素中定义的包名后。没有默认值。

4、android:debuggable

应用是否可以使用debug,甚至运行在用户模式下。true可以,false不能。默认为false。

5、android:description

用户可读的,比应用标签更长、更多的应用描述。此值必须是一个引用字符串。不像标签,他不能被设置为硬编码字符串。没有默认值。

6、android:enabled

Android系统是否可以实例化应用的组件。如果为true可以,如果为false不可以。如果为true时,每个组件的enabled属性决定了此组件

是否可用。如果为false,他重写了组件指定值,所有的组件将不还用。默认为true。

7、android:hasCode

应用是否包含代码。true表示包含,false表示不包含。当值为false时,在启动组件是系统不会试着加载应用的任何代码。默认为true。

8、android:icon

整个应用的图标,还是每个组件的默认图标。这个属性值必须被设置为drawable资源的引用。没有默认值。

9、android:killAfterRestore

在整型系统重置操作中,当他的设置被重置后,应用是否应该被终止。单个包的重置操作不会引起应用被关闭。整个系统的恢复操作仅代表性的发生一次,当电话第一次被设置时。第三方应用将不会经常使用此属性。

默认值为true,意思是,当整个系统被恢复时,应用运行玩他的数据后,将会终止。

10、android:label

一个易读的应用标签,并且还是应用的每个组件的默认标签。这个标签应该被设置为引用字符串资源,当然他也可以像其他字符串一样在用户接口中指定。但是为了方便,在应用开发时,可以被设置未定义字符串。

11、android:manageSpaceActivity

一个Activity子类的全限定名称,这个Activity可以被系统启动让用户管理此应用占有的存储空间。这个Activity也应该用<activity>元素声明。

12、android:name

为这个应用实现的Application子类的全限定名称。当应用启动时,这个类将在应用的其他组件之前被实例化。

这个子类是可选的;大多数应用不需要。在缺省时,Android使用基本Application类的实例。

13、android:permission

客户为了和应用交互必须设置的许可的名称。这个属性是一个便利的途径为应用的组件设置许可。他可以被组件的permission属性重写。

14、android:persistent

应用是否在所有时间下都保持运行。true是,false不是。默认为false。通常情况下应用不应该设置此标识。持久模式仅仅被几个系统应用指定。

15、android:process

为应用下的组件定一个运行进程名称。每个组件可以定义自己的进程名称通过设置自己的process属性。

在默认情况下,Android为应用创建一个进程,当应用的第一个组件需要运行时。所有的组件在同一个进程下运行。这个进程的名称和在<manifest>元素设置的backage属性名相同。通过设置这个属性在可以在其他应用中共享,你可以协调应用的组件在同一个进程中运行,但是只有两应用也共享用户ID和签订相同的证书。如果这个属性的名称一个冒号(":")开始,一个新的私有的进程将被创建。如果一个进程的名称以小写字母开头,一个公共的进程将被创建。一个公共的进程可以被其他应用共享,来减少资源的使用。

16、android:restoreAnyVersion

表明这个应用准备尝试恢复所有的备份数据集合,甚至如果备份数据是比当前安装的应用高的编号存储的。设置为true将允许备份管理者去尝试恢复当版本不匹配,意思是数据冲突。要小心使用。默认为false。

17、android:taskAffinity

提供给应用下所有组件的类同名称,除了设置了自己的taskAffinity属性的组件。默认情况下所有的组件使用相同的affinity。Affinity的名称和在<manifest>元素中设置的包名相同。

Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系。默认如果没有设置taskAffinity,则taskAffinity跟包名是一样的
taskAffinity 和 FLAG_ACTIVITY_NEW_TASK可用来决定activity启动时是否需要新建一个task。我们分四种情况看一下这两个标志对启动activity的影响:(前提:从MainActivity中启动ActivityA)
1)、两个标志都不设置
2)、有FLAG_ACTIVITY_NEW_TASK  
3)、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)
4)、有FLAG_ACTIVITY_NEW_TASK有taskAffinity
注意上面的标志都是针对于启动的ActivityA,FLAG_ACTIVITY_NEW_TASK  是在启动ActivityA的Intent中设置的,taskAffinity 是在AndroidManifest中ActivityA中设置,另外注意这里两个actiity的启动模式都设置为standard
①、先看第一中情况:

主要代码:

<activity android:name=".ActivityA"    
			android:launchMode="standard"  
			android:label="@string/title_activityA">    
  <intent-filter>    
	  <action android:name="com.leaves.ipanel.ActivityA"/>    
	  <category android:name="android.intent.category.DEFAULT"/>    
  </intent-filter>    
</activity>

MainActivity启动activity

public void onClick(View arg0) {  
	// TODO Auto-generated method stub  
	Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
	Intent intent = new Intent("com.leaves.ipanel.ActivityA");      

	startActivity(intent);   
}

启动A之后的堆栈:

②、有FLAG_ACTIVITY_NEW_TASK  
我们添加FLAG_ACTIVITY_NEW_TASK  

public void onClick(View arg0) {  
	// TODO Auto-generated method stub  
	Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
	Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
	intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
	startActivity(intent);   
}

启动A之后的堆栈:

③、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)

<activity android:name=".ActivityA"    
            android:launchMode="standard"  
            android:taskAffinity="com.leaves.test.ActivityA"  
          android:label="@string/title_activityA">    
       <intent-filter>    
           <action android:name="com.leaves.ipanel.ActivityA"/>    
           <category android:name="android.intent.category.DEFAULT"/>    
       </intent-filter>    
</activity>
public void onClick(View arg0) {  
    // TODO Auto-generated method stub  
    Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
    Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
          
    startActivity(intent);   
}

查看一下启动A之后的堆栈:

④、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

把FLAG_ACTIVITY_NEW_TASK添加上去    

public void onClick(View arg0) {  
	// TODO Auto-generated method stub  
	Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
	Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
	intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
	startActivity(intent);   
}

查看一下启动A之后的堆栈:

上面我们测试的两个Activity是在同一个应用中,如果他们在不同的应用中呢,例如ActivityA跟MainActivity不在一个apk中,其实情况还是一样的.因为默认如果没有设置taskAffinity,则taskAffinity跟包名是一样的。若不考虑android:allowTaskReparenting,如果ActivityA跟MainActivity不在一个apk中,当没有FLAG_ACTIVITY_NEW_TASK时,则两者应该是在同一个task,但是如果有FLAG_ACTIVITY_NEW_TASK,则两者应该会在不同的task中。 

18、android:theme

为应用下的组件定义一个引用自样式资源的主题。个别的activities可以设置自己的主题,通过设置自己的theme属性。

19、android:uiOptions

这个属性设置了Activity的UI的额外选项。它必须是下表中的一个值:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!