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

你的包名和证书

其中最明显和最可见的是“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. 关于自己写C++的一点风格

    现在,我学了很长时间的C++,但是自己就是无法精通.许多知识是入门书上没有的.现在写C++最重要的就是风格问题. 我现在的C++风格: 把自己所有的东西都放在一个名称空间下. 没有全局的函数,有的函数 ...

  2. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  3. ABP文档 - 目录

    ABP框架 概览 介绍 多层结构 模块系统 启动配置 多租户 集成OWIN 共同结构 依赖注入 会话 缓存 日志 设置管理 时间 领域层 实体 值对象(新) 仓储 领域服务 工作单元 领域事件(Eve ...

  4. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  5. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  6. Android Button的基本使用

    title: Android Button的基本使用 tags: Button,按钮 --- Button介绍: Button(按钮)继承自TextView,在Android开发中,Button是常用 ...

  7. jquery.Callbacks的实现

    前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于jq源码解读系列,博客园里有很多,推荐大 ...

  8. iOS开发之ReactiveCocoa下的MVVM(干货分享)

    最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...

  9. Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用

    通过本文你将学会如下内容: 1,如何使用Xamarin开发跨平台(Windows,Android,iOS)应用. 2,如何使用微软的登录界面登入Microsoft账号. 3,如何使用Outlook邮箱 ...

  10. 【读书】PHP程序员要读的书目(不断完善中)

    本文地址 分享提纲: 1. PHP 2. Linux 3. Apache/Nginx 4. Mysql 5.设计模式/架构 6. 缓存并发 7. 其他语言 8. 代码基础 9. 大前端 10. 管理生 ...