AndroidManifest详解之Application(有图更好懂)

能够包含的标签:

  1. <activity>
  2. <activity-alias>
  3. <service>
  4. <receiver>
  5. <provider>
  6. <uses-library>

常用的属性:

android:process

默认情况下,Android为每个应用程序创建一个单独的进程,所有组件运行在该进程中,这个默认进程的名字通常与该应用程序的包名相同。比如

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lt.mytest" >

那么该程序默认的进程名为com.lt.mytest

设置该属性可以使得本应用程序与其它应用程序共享相同的进程,仅仅当这两个应用程序也共享一个拥有相同签名的UserId。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.phone" >

与其它应用程序共享的一个Linux User Id的名字。

默认情况下,Android为每个应用程序分配一个唯一的User Id。然而,如果有多个应用程序都将该属性设置为一个相同的值,那么它们将共享相同的Id。如果这些应用程序再被设置成运行在一个相同的进程,它们便可以彼此访问对方的数据。

android:allowbackup

是否将程序加入到系统的备份和恢复架构中。

android:taskAffinity

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

1、先看第一中情况:

主要代码:

<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之后的堆栈:

2、有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之后的堆栈:

3、无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之后的堆栈:

4、有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中。

android:allowTaskReparenting

主要作用是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函数时就会明白这个是怎么回事了。

android:exported

这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。

它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。

这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。

AndroidManifest详解之Application(有图更好懂),布布扣,bubuko.com

时间: 2024-11-03 20:53:27

AndroidManifest详解之Application(有图更好懂)的相关文章

AndroidManifest具体解释之Application(有图更好懂)

可以包括的标签: <activity> <activity-alias> <service> <receiver> <provider> <uses-library> 经常使用的属性: android:process 默认情况下,Android为每一个应用程序创建一个单独的进程,全部组件执行在该进程中,这个默认进程的名字通常与该应用程序的包名同样.比方 <manifest xmlns:android="http://s

Android-manifest详解

Android-manifest详解 一 配置1 android:name:名字 android:theme:主题 android:label:标签 android:description:描述 android:icon:图标 android:launchMode:启动模式 android:screenOrientation:屏幕方向 android:configChanges:配置改变 android:permission:权限 android:multprocess:多进程 android:

Android清单文件详解(五)----&lt;application&gt;的属性详解

前面第三篇,第四篇博文虽然讲解了application节点的几个属性,但是还不够完全,本着对专业执着的精神,有必要深挖下去. 1.android:allowBackup 它表示是否允许应用程序参与备份.如果将该属性设置为false,则即使备份整个系统,也不会执行这个应用程序的备份操作,而整个系统备份能导致所有应用程序数据通过ADB来保存.该属性必须是一个布尔值,或为true,或为false,其默认值为true. 现在,我们就对前面的HelloWorld实例进行修改.在工程的AndroidMani

《Tomcat与Java Web开发技术详解》思维导图

越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 1Servlet容器加载Servlet类 2Servlet容器创建ServletConfig,初始化配置信息 3Servlet容器创建Servlet对象 4Servlet容器调用Servlet对象的init(ServletConfig) 时机:首次被请求或配置了<load-on-startup>

AndroidManifest详解

一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置. 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

JavaScript动画:offset和匀速动画详解(含轮播图的实现)

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. offset简介 我们知道,三大家族包括:offset/scroll/client.今天来讲一下offset,以及与其相关的匀速动画. offset的中文是:偏移,补偿,位移. js中有一套方便的获取元素尺寸的办法就是offset家族.offset家族包括: offsetWidth offsetHight offsetLeft offsetTop offsetParen

java集合:java集合详解及类关系图

List和Set继承自Collection接口. Set无序不允许元素重复.HashSet和TreeSet是两个主要的实现类. List有序且允许元素重复,支持null对象.ArrayList.LinkedList和Vector是三个主要的实现类. Map也属于集合系统,但和Collection接口没关系.Map是key对value的映射集合,其中key列就是一个集合.key不能重复,但是value可以重复.HashMap.TreeMap和Hashtable是三个主要的实现类. SortedSe

操作符详解(思维导图)

算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用.函数调用和结构成员 (可以看完结构体和指针再详细了解结构体成员访问符) 原文地址:https://www.cnblogs.com/fengkun/p/11964900.html

useradd思维导图详解

useradd思维导图详解 本思维导图,用来说明Linux的的用户和群组的详细关系. Xmind文件和预览图: 思维导图文件用Xmind软件打开,下载链接:useradd详解.rar 预览图: Linux笔记分享,如有错误之处,欢迎留言指正,谢谢!