2-8 修改项目的程序包名称和应用程序 ID
如果用户将第 2-5 节的 Ch02_Button 范例部署到手机上执行,然后又把第 2-6 节的范例 Ch02_EditText 部署到手机上执行,会发现手机的应用程序列表中只有 Ch02_ExitText,却没有 Ch02_Button。
在第1章曾经提过,程序包名称是 Android App 在手机上的身份证 ID,而 Ch02_ExitText 项目是从 Ch02_Button 复制而来的,它们的程序包名称相同(?ag.com.ch02_button),因此后来部署到手机上的 Ch02_ExitText 会覆盖掉之前的 Ch02_Button。
其实在 Android Studio 的项目中,有 3 个地方和程序包名称有关。
- Java 类程序的程序包名称
所有的 Java 程序(如 MainActivity 程序)都必须指定程序包名称,这是 Java 规定的,以便让每个类名称都是全世界唯一的。例如:
- 应用程序的程序包名称
这是用来作为App的身份证 ID的。另外,项目的资源类(R.java)也会以此作为其所属的程序包名称。此名称定义在 AndroidManifest.xml 中。
3.在 Gradle 中设置的应用程序 ID(Application Id)
Android Studio 是使用 Gradle 系统构建(Build)程序的,由于同一个项目可以构建多种不同的 apk 程序(如免费版、专业版等),因此在 Gradle 中可以针对每种 apk 指定不同的“应用程序 ID”,以便在构建时取代 AndroidManifest.xml 中的程序包名称, 而成为 apk 最后的身份证 ID。
以上3种名称默认都会相同(如都是com.?ag.ch02_button),但其实并不一定要相同。除非的确有必要,否则还是保持一致比较好,这样才不会造成混淆。
下面示范如何修改 Ch02_EditText 项目的程序包名称,首先使用 Refactor(重构)功能快速修改前两项名称。
接下来修改应用程序 ID,虽然可以直接打开前述的 Gradle 文件进行修改,但为了避免改错或漏改,而且改完还要重建 Gradle,所以还是利用 Android Studio 提供的界面修改,这样比较直接而且安全。依次单击“File/Project Structure...”菜单选项,然后进行如 下操作。
延伸阅读
(1)如果想查询各个组件有哪些属性、方法,或者想看更详细的说明,可连到 Android 开发者网站 (developer.android.com),然后以组件或功能的名称进行搜索,例如:
(2)有关 TextView、EditText、Button 的其他属性与方法,可到 Android 开发者网站分别以类名称进行搜索,以得到详细的说明。
(3)有关 Android layout 布局文件的 XML 编写格式,可到 Android 开发者网站以在线文件Layout XML进行搜索。
(4)有关 Application Id 和 Package Name 的详细解说,可到 Android 开发者网站以Application Id进行搜索。
重点整理
*1. Android App 是由一个个界面所组成的,每一个界面都由各自的 Activity负责。Activity 的组成可分成“视觉”与“程序逻辑”两部分:视觉也就是用户界面的设计,而程序逻辑是程序行为的设计。在项目中,视觉部分主要是在 res 文件夹下的界面布局文件和各种资源;而程序逻辑是 java 文件夹中的 Java 程序。
*2. Activity 的界面内容是用资源中的布局(Layout)文档定义的。
- Android 项目向导创建的默认布局包含两个组件:RelativeLayout 布局组件是通过“相对(Relative)位置”规划组件的位置;TextView 组件是用来显示一段文字,如默认显示“Hello world!”字符串。
*4. 在布局中为组件的 id 属性命名,在程序中就能通过组件的资源ID存取组件。 在布局编辑器的 Text 页面中设置名称时,其格式为“@+id/( 名称 )”,在程序中存取时的资源 ID 就是“R.id. 名称”。
- Android 支持多种尺寸单位,其中 sp、dp 是建议使用的逻辑单位,它会随手机屏幕的实际大小、分辨率而调整。sp 还会随手机设置居中的字号调整,所以比较适用于组件的 textSize 属性。
- 在复制旧项目来使用时,由于 Android App 是以程序包名称分辨程序的,因此在复制后需更改程序包名称,才会被识别为不同的应用程序。不过在实际构建(Build)项目时,会以 Gradle 中设置的应用程序 ID 覆盖掉 apk 的程序包名称,因此也要一并修改应用程序 ID 才行。
*7. 当用户执行 Android App 时,系统会先找出要先启动的 Activity,并创建所要启动的 Activity 对象,再调用onCreate() 方法。在此方法内加入自己的程序,当 Activity 被启动时(Android App 被执行时),就会执行用户的程序。
*8. 在 res 文件夹加入资源时,会自动在项目中创建代表该项资源的资源 ID。在程序中可用“R.资源类.资源名称”的格式存取该资源。
*9. 以“R.资源类.资源名称”为参数调用 ?ndViewById() 会返回代表该组件的 View 类对象,使用时通常要将其转型为组件专用的类(如 TextView)。
- TextView 类的 setText() 方法可设置显示的文字。
- 按钮的 onClick 属性可指定为 Activity 类中 public 的方法名称,当用户单击按钮时,Android 就会调用该方法。若方法的定义不对、名称不符合,则用户单击按钮时会产生错误。
- 若想将编写好的程序直接放在手机上执行,则可用手机附带的 USB 线把手机与计算机相连,再从 Android Studio 中直接将程序上传到手机中执行。