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

2023-10-31

能够包含的标签:
  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。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Flutter android 风味生成 apk

    我正在尝试使用 flutter 设置 Android 风格 我有两个入口点 lib main prod dart lib main dev dart 我还在我的 gradle 文件中添加了以下内容 flavorDimensions vers
  • 如何在 TableRow 的一个单元格中添加超过 1 个视图?

    如上所述 如何将 2 个视图放入一个单元格中tablerow 我创建了一个表格布局 并通过代码添加行 下面是我的代码 TableLayout v TableLayout inflater inflate R layout featureit
  • tns run android --emulator 不工作 - NativeScript

    我已按照此步骤操作link http docs nativescript org tutorial chapter 1 当我使用命令运行时tns run android emulator 我在命令提示符中收到以下错误 Configuring
  • R 无法解析为变量

    我想修复这个错误 R 无法解析为变量 我查了很多答案 但找不到正确的答案 我尝试了一切 有人可以帮助我吗 我的主要活动是自动创建的 显示错误的是从以下位置开始的三行case R id button1 package de vogella a
  • 自动调整文本视图大小不起作用

    您好 我在我的 Android 应用程序中使用自动调整大小文本视图 我的应用程序 minSdkVersion 是 19 所以我正在使用支持库 https developer android com guide topics ui look
  • SQLite同时读写

    我读过很多主题 但无法找到问题的答案 是否可以同时读写 我有后台线程更新一些数据 UI 需要存储在数据库中的一小部分数据 所以在UI线程中执行SELECT操作 但当更新正在进行时它会阻塞 结果 UI 冻结了几秒钟 有人在写入时成功从数据库读
  • 如何在 Android 中动态添加新的 Android 芯片?

    我有一个名为 Question 的类 其中包含标签的字符串数组 我试图使用 Kotlin 显示 Recyclerview 中的每个问题以及新芯片中的每个标签 这些芯片将包含在一个 ChipGroup 中 我的问题是 如何将数组的每个标签元素
  • 如何将字节数组转换为图像 [kotlin]

    我想将字节数组转换为图像并在图像视图中显示它 但不知道该怎么做 有人可以指导我吗 我使用这个函数将位图转换为字节数组 private fun BitmapToByteArray ByteArray val stream ByteArrayO
  • Android Beacon Library - 正确使用BluetoothMedic?

    根据以下观察 我对蓝牙医疗的使用有一些疑问 由于蓝牙在我的一台设备上停止 我一直在查看 BluetoothMedic 看看它是否能提供帮助 我查看了调试消息和源代码 根据我是否使用enablePeriodicTests 或单独运行runSc
  • Jack(Java Android 编译器套件)将如何影响 Scala 开发人员

    现在随着公告Jack https source android com source jack html谷歌阐明了 Java 与 Android 相关的可预见的未来 但这对 Scala 和其他基于 JVM 的语言开发人员有何影响 尤其 Sc
  • 如何加密和解密Android SD卡中的文件夹

    是否可以加密 SD 卡文件夹 请帮助我 如果可以的话 加密和解密的处理器是什么 不可能 让我知道我可以为 android SDcard 中的文件夹安全做些什么 我的文件在这里 mnt sdcard image1 jpeg 那么如何在andr
  • 当键盘出现时滚动布局

    当键盘出现并隐藏工具栏 FrameLayout 时 我的屏幕大小调整到顶部 我只需将聊天项目滚动到顶部并将框架布局保持在顶部 我尝试了谷歌和SO的一些例子 但对我没有任何帮助
  • Android ViewPager - 在左侧和右侧显示页面预览

    我用的是安卓系统ViewPager 我想要做的是在左侧和右侧显示页面的预览 我已经知道在哪里可以使用否定pageMargin显示右侧的预览 setPageMargin 100 无论如何 我也可以显示左侧的预览吗 它基本上类似于我正在寻找的画
  • 在 Android 模拟器中更改屏幕亮度

    Android模拟器可以测试屏幕亮度变化吗 我尝试过各种示例 它们都使用以下代码片段 WindowManager LayoutParams lp window getAttributes lp screenBrightness some f
  • 如何在Android上读取/写入外部USB存储设备?

    我目前正在制作一个应用程序 需要能够读取和写入通过 USB OTG 适配器连接的 USB 闪存驱动器 有没有一种简单的方法可以通过标准访问此存储Java io File蜜蜂 该应用程序只能在运行 Android 4 2 2 的已 root
  • 如何将 onClick 侦听器附加到应用程序小部件上的列表视图项

    我喜欢向列表视图的每个项目添加一个 onClick 侦听器 但我尝试过的方法都不起作用 这是我的 RemoteViewsFactory public class MyRemoteViewsFactory implements RemoteV
  • 应用程序启动时显示徽标几秒钟

    我想在应用程序启动并且菜单可见之前显示徽标几秒钟 当它消失时我也想使用一些 我应该创建一个新活动吗 我可以在布局中设置它吗 为包含您的徽标的初始屏幕定义一个布局 然后将此代码添加到您的活动中 public void onCreate Bun
  • 从应用程序打开无线设置

    我想直接从我的应用程序打开 设置 gt 无线和网络 我怎样才能做到这一点 尝试这个 startActivity new Intent android provider Settings ACTION WIRELESS SETTINGS 或者
  • 找不到图标路径的 Cordova Android 版本

    打字时cordova build android在 DOS 框中 没有构建任何内容 但我看到一条错误消息 错误 源路径不存在 resources android icon drawable hdpi icon png 我已经更新了 Cord
  • 如何像 youtube 一样在纸板中观看普通视频

    我有一个可以正常播放的应用程序VR视频 我的应用程序有两个玩家可以玩这两种类型 在我的VrVideoView有一个按钮可以让视频播放立体声模式 我的问题是 我怎样才能观看正常的视频Cardboard就像YouTube app None

随机推荐

  • C语言——计算阶层求和

    利用两次for循环进行求和 include
  • 中国跨境电商品牌营销白皮书

    导读 报告显示 近年来 中国品牌在走向国际市场的过程中面临着诸多挑战 跨文化 和 品牌形象接受度低 成为中国品牌在海外营销中的主要问题 由于国内外文化存在差异 中国品牌在营销方面遇到了困难 许多品牌往往照搬国内的广告模式 无法吸引国外消费者
  • SVG主要的画图元素以及几个基本的几何图形介绍

    本文主要介绍SVG画图中的两种主要画图元素 Path和Text 以及SVG的几个基本的几何形状 如线条 折线 多边形 椭圆 矩形 圆等等 本文主要采取理论 例子的方式来介绍 这种方式向来都是解释介绍的王道 同时也是学习的一种好方法 第一 首
  • 413 Request Entity Too Large

    一 字面意思是请求体太大 一般出现在上传文件 二 主要问题 Nginx默认最大能够上传1MB文件 大于1MB的文件自然无法上传 打开nginx conf 没权限找运维人员 在http 中设置 client max body size 50m
  • empire-web可视化

    首先说明我的安装系统为kali 教程同样适用于ubantu系统 1 首先安装Empire 没有安装的可以去先参考其他教程安装 2 下载empire web git clone https github com interference se
  • 【Python 笔记】Linux下安装pip方法的全总结

    本文研究记录了 Linux 下安装 pip 的全部方法 文章目录 1 通过 Linux 系统的包管理工具安装 1 1 apt 包管理工具安装 pip 1 1 1 安装 1 1 2 升级 1 1 3 issue5599 1 2 yum 包管理
  • 矩阵分解——谱分解

    文章目录 先修知识 幂等矩阵 谱分解定理 谱分解的流程 谱分解的推论 谱分解的应用 先修知识 幂等矩阵 谱分解定理 谱分解的流程 谱分解的推论 谱分解的应用
  • 浅析Bootstrap中Tab(标签页)的使用方法

    Bootstrap 导航元素使用相同的标记和基类 改变修饰的class 可以在不同的样式间进行切换 如 nav pills 胶囊式导航 与 nav tabs 标签式导航 创建一个标签式的导航菜单 以一个带有class nav 的无序列表开始
  • xxl-job任务操作源码分析(四)

    手动执行任务 页面上点击 执行 按钮 前端会发送一个请求 jobinfo trigger post 请求 param id 任务ID controller最终会调用service的方法进行处理 public ReturnT
  • 浅谈sql中的in与not in,exists与not exists的区别

    1 in和exists in是把外表和内表作hash连接 而exists是对外表作loop循环 每次loop循环再对内表进行查询 一直以来认为exists比in效率高的说法是不准确的 如果查询的两个表大小相当 那么用in和exists差别不
  • js遍历字典

    for var key in data html
  • eclipse使用pthread.h遇到“pthread_create”未定义的问题。

    解决方法 a 需要在编译时添加 lpthread参数 g XXXXX cpp lpthread o XXXXX o b 在eclipse中配置 project gt properties gt c c Build gt GCC C Link
  • 并行前缀加法器 verilog

    并行前缀加法器verilog实现 关于并行前缀加法器的介绍 请看这里 前缀网络用KS树 64位加法器的verilog实现如下 module cal union input g2 p2 g1 p1 output G P assign G g2
  • 用它调试线上 bug,真得劲

    webconsole webconsole 是 arthas 提供的 web 页面 它可以让用户在自己的电脑上 连接远程服务器的 arthas 执行命令 命令的执行方式和在服务器直接操作没有任何区别 webconsole 连接远程服务器成功
  • JS实现弹出子窗口并获取返回值功能

    最近一段时间 所做系统需要实现使用js弹出一个自定义窗口 并且获取窗口的返回值功能 经多方查询未能找到较好的示例 所以无奈之下自己开发了一个弹出式窗口 并稍微封装了一下 废话少说 上代码 父页面弹出窗口示例 c id click funct
  • 原码, 反码, 补码各类应用(转载,出处文末附有链接)

    一 机器数和真值 在学习原码 反码和补码之前 需要先了解机器数和真值的概念 1 机器数 一个数在计算机中的二进制表示形式 叫做这个数的机器数 机器数是带符号的 在计算机用一个数的最高位存放符号 正数为0 负数为1 比如 十进制中的数 3 计
  • 关于eclipse tomcat启动但项目无法启动

    1 报错信息 没有加载spring web引起tomcat自己有启动但是项目没有启动 具体的截图 可以清楚的看到tomcat虽然启动了 但是没有项目启动的信息 2 解决方法 我们在将项目添加至tomcat时会发现该项目并没有将web包加载
  • 解决ubuntu 上QT无法被输入中文的BUG

    项目场景 使用QT FOR ROS在Ubuntu上开发ROS项目 问题描述 不管如何切换输入法的中英文都无法在QT上输入中文 只能输入英文 我用的是fcitx 搜狗输入法 原因分析 我认为时因为缺少了一些依赖或者缺少了一些支持中文的包 解决
  • button效果:从右往左慢慢渐变

    题记 我们工作中会出现一些按钮需要用一些2D的效果 用css会发现很容易做到这样的效果 大部分的思路通过过渡 2D hover事件 以及overflow的之间配合实现button按钮的背景颜色的渐变效果 下边是相关的一些代码
  • AndroidManifest详解之Application(有图更好懂)

    能够包含的标签