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

你的包名和证书

其中最明显和最可见的是“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. 【.net 深呼吸】跨应用程序域执行程序集

    应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. 利用bootstrap的carousel.js实现轮播图动画

    前期准备: 1.jquery.js. 2.bootstrap的carousel.js. 3.bootstrap.css. 如果大家不知道在哪下载,可以联系小颖,小颖把这些js和css可以发送给你. 一 ...

  4. 深入理解CSS中的margin负值

    前面的话 margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它.它看似简单 ...

  5. 通过三次优化,我将gif加载优化了16.9%

    WeTest 导读 现在app越来越炫,动不动就搞点动画,复杂的动画用原生实现起来挺复杂,如是就搞起gif播放动画的形式,节省开发成本.   背 景 设计同学准备给一个png序列,开发读取png序列, ...

  6. vue.js学习笔记

    有了孩子之后,元旦就哪也去不了了(孩子太小),刚好利用一些时间,来公司充充电补补课,学习学习新技术,在这里做一个整理和总结.(选择的东西,既然热爱就把他做好吧!). 下来进入咱们的学习环节: 一.从H ...

  7. 破解SQLServer for Linux预览版的3.5GB内存限制 (UBUNTU篇)

    在上一篇中我提到了如何破解RHEL上SQLServer的内存大小限制,但是Ubuntu上还有一道检查 这篇我将会讲解如何在3.5GB以下内存的Ubuntu中安装和运行SQLServer for Lin ...

  8. 【干货分享】流程DEMO-费用报销

    流程名: 费用报销 业务描述: 流程发起时,要选择需要关联的事务审批单,会检查是否超申请,如果不超申请,可以直接发起流程,如果超了申请,需要检查预算,如果预算不够,将不允许发起报销申请,如果预算够用, ...

  9. Linux硬件IO的优化简介

    Linux硬件IO的优化简介 首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的 ...

  10. linux压力测试工具stress

    最近给PASS平台添加autoscaling的功能,根据服务器的负载情况autoscaling,为了测试这项功能用到了stress这个压力测试工具,这个工具相当好用了.具体安装方式就不说了.记录下这个 ...