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

你的包名和证书

其中最明显和最可见的是“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. TODO:搭建Laravel VueJS SemanticUI

    TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...

  2. 自定义Inspector检视面板

    Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [Sys ...

  3. SVD奇异值分解的基本原理和运用

    SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...

  4. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  5. java时间

    Calendar.getInstance().getTime() 获取当前时间(包括星期和时区 CST China Standard Time):  Fri Jan 06 21:03:36 CST 2 ...

  6. bzoj3037--贪心

    题目大意: applepi手里有一本书<创世纪>,里面记录了这样一个故事--上帝手中有着N 种被称作"世界元素"的东西,现在他要把它们中的一部分投放到一个新的空间中去以 ...

  7. css选择器

    常用css选择器,希望对大家有所帮助,不喜勿喷. 1.*:通用选择器 * { margin: 0; padding: 0; } 选择页面上的全部元素,通常用于清除浏览器默认样式,不推荐使用. 2.#i ...

  8. 常用 meta 整理

    <!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 --> <meta name="HandheldFriendly" con ...

  9. iOS 后台处理

    iOS 后台处理的常见用途 1.进入后台时候删除资源:应用处于挂起状态的时候所占用的资源越少,该应用被iOS终止的风险就越低.通过从内存中清理那些易于重新创建的资源,可以增加应用驻留内存的机会,因此可 ...

  10. Android之DOM解析XML

    一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息 ...