有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装。 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外。

你的包名和证书

其中最明显和最可见的是“manifest package name”,它是在AndroidManifest.xml中为您的应用程序提供的唯一名称。 该名称使用Java语言风格的命名约定,具有Internet域所有权有助于避免名称冲突。 例如,由于Google拥有域“google.com”,因此所有应用程序的清单文件包名称应以“com.google”开头。开发人员必须遵守此约定,以避免与其他开发人员发生冲突。

一旦您的应用程序在其清单包名称下发布,这就是应用程序的唯一永久标识。 切换到不同的名称会产生一个全新的应用程序,无法安装为现有应用程序的更新。

与manifest包名称一样重要的是应用程序签名的证书。 签名证书表示应用程序的作者。 如果您更改应用程序已签署的证书,则它现在是一个不同的应用程序,因为它来自不同的作者。 此不同的应用程序不能作为对原始应用程序的更新上传到Market,也不能作为更新安装到设备上。

在以这两种方式之一安装更改的应用程序时,用户看到的确切行为是不同的:

  • 如果清单包名称已更改,则新应用程序将与旧应用程序一起安装,因此它们同时在用户的设备上共存。
  • 如果签名证书更改,尝试将新应用程序安装到设备上将失败,除非卸载旧版本。

如果更改应用程序的签名证书,则应始终更改其清单包名称,以避免在安装时出现故障。 换句话说,来自不同作者的应用程序使它成为一个不同的应用程序,并且应该适当地改变其包名称以反映它。 (当然,使用相同的软件包名称作为使用测试密钥签名的应用程序的开发版本,因为这些文件没有发布)。

你的AndroidManifest.xml是一个公共API

不只是你的包名是不可变的。AndroidManifest.xml的主要功能主要是从应用程序中声明一个公共API,供其他应用程序和Android系统使用。 您在清单中声明的每个组件都不是私有的(即其android:exported状态为true),都应被视为公共API,并且绝不能以破坏兼容性的方式进行更改。

构成兼容性中断的一个微妙但重要的方面是您的Activity、service和接收器组件的android:name属性。 这可能是令人惊讶的,因为我们认为android:name指向实现我们的应用程序的私有代码,但它也是(与清单包名称相结合)组件的官方唯一的公共名称,由ComponentName 类表示。

更改应用程序中的组件名称可能会对用户产生负面影响。一些例子是:

  • 如果应用程序的MainActivity的名称发生更改,则用户对其进行的任何快捷方式将不再工作。快捷方式是一个Intent,它直接指定应该运行的ComponentName。
  • 如果实施动态壁纸的服务名称发生更改,则启用动态壁纸的用户在获取新版应用时会将壁纸还原为系统默认值。对于输入法,辅助功能服务,Honeycomb的新高级Widget等也是如此。
  • 如果实现设备管理器的接收器的名称改变,则与活动壁纸示例一样,当应用更新时,设备管理器将被禁用。这也适用于其他类型的接收器,如App Widget。

这些行为Intent系统在Android上使用的结果。有两种主要的意图:

  • 隐式意图(Implicit Intents)仅指定它们应该匹配的“what”,使用动作,类别,数据,MIME类型等。它们将找到的确切组件仅在运行时由包管理器与当前应用程序匹配来确定。
  • 显式意图通过ComponentName指定他们应该匹配的单个显式“who”。无论在意图中是什么,它只与在其ComponentName中给出的确切的清单包名称和类名称相关联。

这两种类型的意图对于Android如何与您的应用程序交互都很重要。一个典型的例子是用户如何浏览和选择动态壁纸。

为了让用户选择一个动态壁纸,Android必须做的第一件事是显示一个可用的动态壁纸服务的列表。它通过使用动态壁纸的适当动作构建一个隐式Intent,并询问程序包管理器所有支持此Intent的服务。结果是向用户显示的动态壁纸的列表。

当用户实际选择他们想要使用的特定动态壁纸,然而,Android现在必须建立一个明确的Intent,标识特定的动态壁纸。这是什么被交给WallpaperManager告诉它显示哪个壁纸。

这就是为什么更改清单中组件的名称将导致壁纸消失:之前保存的显式Intent现在无效,因为它引用的ComponentName不再存在。没有可用信息来指示组件的新名称。 (例如,考虑您的应用程序是否有两个不同的动态壁纸服务)相反,Android必须将活动壁纸视为已卸载,并恢复为默认壁纸。

这是输入法,设备管理员,客户经理,应用程序窗口小部件,甚至应用程序快捷方式的工作原理。 ComponentName是您在清单中声明的​​组件的公共唯一名称,如果对其他应用程序可见,则不能更改。

总之:你的应用程序的某些部分不能改变。 请小心。

本文翻译自:https://android-developers.googleblog.com/2011/06/things-that-cannot-change.html

转发请注明出处:http://www.cnblogs.com/jycboy/p/android_thingnotchange.html

Android程序中--不能改变的事情的更多相关文章

  1. android 程序中res/values-v14/styles.xml报错的解决办法

    从旧的ADT迁移的新的ADT时, android 程序中res/values-v14/styles.xml报错: error: Error retrieving parent for item: No ...

  2. 【转】如何在 Android 程序中禁止屏幕旋转和重启Activity

    原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变 ...

  3. SQLite在Android程序中的使用方法,SQLite的增删查改方法

    Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...

  4. 【转】在android程序中使用配置文件properties

    在android程序中使用配置文件来管理一些程序的配置信息其实非常简单 在这里我们主要就是用到Properties这个类直接给函数给大家 这个都挺好理解的 读写函数分别如下: //读取配置文件 pub ...

  5. 如何在 Android 程序中禁止屏幕旋转和重启Activity

    禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android ...

  6. 在Android程序中使用已有的SQLite数据库

    已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...

  7. Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结

    前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...

  8. android程序中使用命令行及获得命令行执行后的内容

    在开发android项目中,需要在程序中使用命令行执行,获得命令行执行后的结果并做处理. 下面是自己写的一个小例子,供以后参考使用: public String android_command(){ ...

  9. Android程序中使用iconfont心得

    1.关于iconfont iconfont既是icon又是font,具体来说应该是用font形式展现的icon.与传统图片格式的图标不同,这一种图标因为是以字体形式展现的,所以更改大小.颜色.背景颜色 ...

随机推荐

  1. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  2. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  3. 04.LoT.UI 前后台通用框架分解系列之——轻巧的弹出框

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  4. HTML块级元素

    前面的话   在HTML5出现之前,人们一般把元素分为块级.内联和内联块元素.本文将详细介绍HTML块级元素 h   标题(Heading)元素有六个不同的级别,<h1>是最高级的,而&l ...

  5. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  6. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  8. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  9. 从国内流程管理软件市场份额看中国BPM行业发展

    随着互联网+.中国制造2025.工业4.0等国家战略的支持与引导,企业在数字经济时代的信息化表现惊人,越来越多企业认识到,对于企业的发展来说,信息自动化远远还不够,企业的战略.业务和IT之间需保持高度 ...

  10. RCP:ISourceLocator翻译

    org.eclipse.debug.core.model.ISourceLocator A source locator locates source elements for stack frame ...