Android应用开发的一般文件组织结构讲解

认识Android编程各个文件之间的联系和使用方法,以及认识Activity文件结构的大体可以看下图:

代码在src中的.java文件中编辑,gen目录下有一个R.java的文件,这个文件存储res目录下各种资源文件的id号,在主文件java中调用该资源的时候直接调用id号即可,如 R.layout.main ,这个条目得打开R.java文件中查看,"R"对应R.java文件,"layout"对应R.java文件中的layout类,"main"对应layout类中的一个静态常量声明。

实际上res中的每一个文件都会在R.java中自动产生静态常量,这是res目录和assets目录最大的不同之处,这样做的好处不言而喻,对资源的修改不会对代码产生任何的影响,因为代码中使用的只是ID号码而已。

res目录中的前三个文件夹是存放图片资源的,而且通常情况下同一张图片要有三个版本二,高低中分辨率。

第四个文件夹是存放布局文件的,main.xml,一个Activity对应一个xml文件,而且每个Activity都要在AndroidMainfest.xml中注册一下。default.properties文件在学java的时候接触过,无非也是对对代码的可重复性使用和修改提供了方便而已。第一个Java Activity程序,会体现出这些文件之间的关系和使用。

下面程序任务:添加一个显示文本和一个按钮

对Activity的初步认识:就像一个窗口,能显示信息,又像一个容器,能容纳功能空间,如button,在程序角度上看,又像一个 类,可以和其他的类(Activity)发生联系。

创建Activity的要点:

一个Activity就是一个类,类名随意起,不过必须继承Activity这个父类。
需要复写onCreate()方法
每一个Activity都应该在AndroidManifest.xml文件中进行配置
为Activity添加必要的控件
整体文件代码预览:

MyActivity.java 文件

package geeker.MyActivity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MyActivity extends Activity {
  //成员变量的声明
  private TextView myTextView = null;
  private Button myButton = null;
  //重写OnCreate方法,会自动生成
  public void onCreate(Bundle savedInstanceState) {
    //调用父类方法,该句代码自动生成
    super.onCreate(savedInstanceState);
    //通过布局文件的id调用该Activity所使用的布局文件
    setContentView(R.layout.main);
    //通过findViewById()方法拿到布局文件中添加的控件
    //不过在布局文件中添加控件的时候必须定义id号,
    //如:android:id="@+id/myTextView"
    myTextView = (TextView)findViewById(R.id.myTextView);
    myButton = (Button)findViewById(R.id.myButton);
    //向控件上制定显示文字
    myTextView.setText("This is my first Activity !");
    myButton.setText("MY FIRST BUTTON");
  }
}

main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<TextView
  android:id="@+id/myTextView"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />
<Button
  android:id="@+id/myButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />
</LinearLayout>

R.jar 文件该文件自动生成,不要自己改动

/* AUTO-GENERATED FILE. DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found. It
 * should not be modified by hand.
 */
package geeker.MyActivity;
public final class R {
  public static final class attr {
  }
  public static final class drawable {
    public static final int icon=0x7f020000;
  }
  public static final class id {
    public static final int myButton=0x7f050001;
    public static final int myTextView=0x7f050000;
  }
  public static final class layout {
    public static final int main=0x7f030000;
  }
  public static final class string {
    public static final int app_name=0x7f040001;
    public static final int hello=0x7f040000;
  }
}

其实走一遍添加Button的流程就明白各个文件间的联系了:

1. 先打开main.xml文件,加一个button按钮的布局

<Button
  android:id="@+id/myButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />

2. 其实上一步完成后,编译运行已经能看到一个Button按钮了,但是我想在按钮上添加文字以说明该按钮的作用,在java中的程序为 :
Button bt = new Button();
bt.setText("MY FIRST BUTTON");

那么在Android程序中如何在.java源文件中拿到刚才在main.xml中添加的控件呢?

基于这个目的,在main.xml文件中加了此句:android:id="@+id/myButton",这一句使得R.java文件中多了一个叫id的类,该控件的id号就在这个类中出现了,这样做为了方便.java文件中的调用。

实际上如果不加上一句,该控件是不会在R.java文件中产生id号码的,因为只有在res目录中添加文件才会自动在R.java中产生id号,而添加一个控件只是在一个资源文件中做修改而已,所以不会自动产生id号。

我们可以看一下R.java文件中自动产生的ID代码:

public static final class id {
    public static final int myButton=0x7f050001;
    public static final int myTextView=0x7f050000;
  }

然后在.java文件中就可通过getViewById()方法拿到控件了。

拿到控件之后就可以像java程序中一样进行相关操作了,代码如:

private Button myButton = null;
myButton = (Button)findViewById(R.id.myButton);
myButton.setText("MY FIRST BUTTON");

实际上这个流程只体现了xml文件和R.java文件之间的联系(通过该句:android:id="@+id/myButton),以及.java与R.java之间的联系(通过该句:findViewById(R.id.myTextView) )。补充一下其他文件关系的代码体现:

MyActivity.java文件与Main.xml文件的联系时通过MyActivity.java文件中的setContentView(R.layout.main);体现的,因为一个Activity文件要对应一个布局文件。

MyActivity.java文件与AndroidManifest.xml文件之间的联系时通过AndroidManifest.xml文件中的。

<activity android:name=".MyActivity"
         android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

来体现的,这也说明了Activity创建的关键点之一:每一个Activity都应该在AndroidManifest.xml文件中进行配置。

PS:获取Android的文件列表的方法

有的时候我们的程序需要去对android的指定目录或者全局目录进行遍历获取其中的文件,但是获取文件的时候可能会遇到无法列出文件夹中的文件的问题,这就是我出现的问题,对于某个子文件夹进行获取listFiles()的时候返回为NULL,也就是不允许列出文件夹中内容。这个是由于android中的安全机制的缘故,由于android继承了Linux系统的传统,对于某个特定的目录有用户的权限,一共分为三种--可读,可写,可执行;虽然说我们可以设置某个特定的目录的权限,但是对于目录里面的子目录和子文件都可以进行权限的设置,也就是说出了根目录权限之外,子目录本身的权限也决定了子目录可否访问,这一点我们需要清楚了解,所以我们在判断完了是否是目录之外,我们还需要在进行listFiles()获取File[]数据后判断获取的数组是否为空,如果为空的话,文件夹是不可访问的。样例代码如下:

package net.nowamagic.file;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.util.Log;
/**
 * @author
 * function 用于扫描SD卡上的文件
 *
 */
public class FileScan {

  private static final String TAG = "FileScan";
  public HashMap<String, String> getMusicListOnSys(File file) {

    //从根目录开始扫描
    Log.i(TAG, file.getPath());
    HashMap<String, String> fileList = new HashMap<String, String>();
    getFileList(file, fileList);
    return fileList;
  }

  /**
   * @param path
   * @param fileList
   * 注意的是并不是所有的文件夹都可以进行读取的,权限问题
   */
  private void getFileList(File path, HashMap<String, String> fileList){
    //如果是文件夹的话
    if(path.isDirectory()){
      //返回文件夹中有的数据
      File[] files = path.listFiles();
      //先判断下有没有权限,如果没有权限的话,就不执行了
      if(null == files)
        return;

      for(int i = 0; i < files.length; i++){
        getFileList(files[i], fileList);
      }
    }
    //如果是文件的话直接加入
    else{
      Log.i(TAG, path.getAbsolutePath());
      //进行文件的处理
      String filePath = path.getAbsolutePath();
      //文件名
      String fileName = filePath.substring(filePath.lastIndexOf("/")+1);
      //添加
      fileList.put(fileName, filePath);
    }
  }

}
时间: 2015-11-30

android sdk安装及开发环境部署

引言在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭建,文章写的尽量详细,希望对准备进入Android开发的朋友有帮助.本教程将分为五个步骤来完成Android开发环境的部署. 第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步: 下载安装Eclipse . 第四步:下载安装Android SDK . 第五步:为Eclip

实现android自动化测试部署与运行Shell脚本分享

我的配置是linux 64, android4.2.2的sdk. 实现的细节都在代码注释里了,变量名以及echo的内容也是说明的一部分. 主流程为: 1.检测是否指定端口的模拟器已经运行,若有则关闭 2.创建模拟器 3.启动模拟器 4.用ant build包,通过检查bin目录下有没有apk来确定是否成功 5.检查指定端口的模拟器是否已正常运行 6.用adb安装apk 7.启动apk的activity,让程序自己跑 8.用shell ps循环检测程序是否已退出,若已退出,检查是否sdcard是是

Android源码中的目录结构详解

Android 2.1 |-- Makefile |-- bionic                        (bionic C库) |-- bootable                (启动引导相关代码) |-- build                        (存放系统编译规则及generic等基础开发包配置) |-- cts                        (Android兼容性测试套件标准) |-- dalvik                    

仅5步搞定Android开发环境部署 Android开发环境搭建教程

在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭建,文章写的尽量详细,希望对准备进入Android开发的朋友有帮助. 本教程将分为五个步骤来完成Android开发环境的部署. 第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步: 下载安装Eclipse . 第四步:下载安装Android SDK . 第五步:为Eclips

Android编程入门之HelloWorld项目目录结构分析

本文实例讲述了Android编程入门之HelloWorld项目目录结构.分享给大家供大家参考,具体如下: 我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Android项目的目录结构.本文的主要主题如下: 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.assets 1.5.res文件夹 1.6.AndroidManifest.xml 1.7

浅谈Android系统的基本体系结构与内存管理优化

Android运行环境一览 Android基于linux内核,面向移动终端的操作系统.主要包括以下几个方面: Application Framework: 这一层为应用开发者提供了丰富的应用编程接口,如 Activity Manager,Content Provider,Notification Manager,以及各种窗口 Widget 资源等.所有的APP都是运行在这一层之上. Dalvik 虚拟机: Dalvik VM采用寄存器架构,而不是JVM的栈架构,更适于移动设备.java源代码经过

Windows下React Native的Android环境部署及布局示例

搭建基础环境 JDK(必须,不解释) SDK(建议使用Android Studio,集成SDK以及模拟器) genymotion(如果是使用真机或者Android Studio自带的模拟器,可以选择不装) NVM(node版本控制器,需要node4.0以上版本) 以上配置不是必须,可自行选择适合自己的环境,部分安装过程可能会涉及到翻墙,需要配置代理 配置踩坑记录 genymotion 这里选择genymotion模拟器来讲解,也会提一下Android Studio自带的模拟器的一些注意点,使用真

使用Docker来加速构建Android应用的基本部署思路解析

意义 极大的缩短安卓开发到测试到产品到渠道的距离. 给安卓程序员减轻负担. Google做的环境已经特别到位了,放到docker里面明显不会有多大的坑(误,逃). Dockerfile https://github.com/lijianying10/FixLinux/blob/master/dockerfiles/androidautobuild/Dockerfile 团队协作的故事 在敏捷开发的站立会议上,我作为一个后端程序员发现安卓程序员发布的时间大概是半个小时左右的时间,我觉得时间太长了应

浅谈Android开发中项目的文件结构及规范化部署建议

一.几句话 使用Gradle及其推荐的项目框架 把密码等敏感数据放入gradle.properties 不要自己写Http客户端,使用Volley或OkHttp库 使用Jackson库来解析JSON数据 避免Guava并出于Dalvik 65K methods limit不要使用过多的库 使用Fragment来绘制UI界面 Activity主要用来管理Fragment 布局文件XML也是代码,好好组织它们 在布局文件里,使用styles以避免重复的属性 使用多个style文件而不是一个巨大的st

浅谈Android开发中ListView控件性能的一些优化方法

ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 1.在adapter中的getView方

浅谈Android开发系列网络篇之Retrofit

Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎么实现的也不太敢用,不然出问题了就不知道怎么办了.这几天比较闲就下下来看了一下,了解一下大概实现方法,细节就不追究了.先来看一个官网的例子,详细说明去网官看 简单示例 首先定义请求接口,即程序中都需要什么请求操作 public interface GitHubService { @GET("/use

浅谈Android Activity与Service的交互方式

实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上. 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用.但缺点也十分明显,发送广播受到系统制约.系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟.同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

浅谈Android View绘制三大流程探索及常见问题

View绘制的三大流程,指的是measure(测量).layout(布局).draw(绘制) measure负责确定View的测量宽/高,也就是该View需要占用屏幕的大小,确定完View需要占用的屏幕大小后,就会通过layout确定View的最终宽/高和四个顶点在手机界面上的位置,等通过measure和layout过程确定了View的宽高和要显示的位置后,就会执行draw绘制View的内容到手机屏幕上. 在详细介绍这三大流程之前,需要简单了解一下ViewRootImpl,View绘制的三大步骤

浅谈Android中Service的注册方式及使用

Service通常总是称之为"后台服务",其中"后台"一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: 1.并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的): 2.具有较长时间的运行特性. 1.Service AndroidManifest.xml 声明 一般而言,从Service的启动方式上

浅谈Android Studio3.6 更新功能

前言 下载google CodeLab的程序时,提示要更新3.6版本才能运行程序,于是更新了一下,看看有什么新功能. 界面设计工具 这次更新了一些设计工具,比如Layout Editor 和 Resource Manager. 现在,在XML或设计工具的颜色选择器中,Android Studio会在您的应用程序中填充颜色资源,以便您快速选择和替换颜色资源值. 拆分视图并放大设计编辑器 设计编辑器(例如,布局编辑器和导航编辑器)现在提供一个拆分视图,使您可以同时查看UI的"设计"视图和&

浅谈 Android 7.0 多窗口分屏模式的实现

从 Android 7.0 开始,Google 推出了一个名为"多窗口模式"的新功能,也就是我们常说的"分屏模式".那么,这个功能有什么用呢?作为开发者,我们又能做些什么? Android 7.0 添加了对同时显示多个 APP 的支持.在手持设备上,两个 APP 可以在分屏模式下并排运行. 嗯,大概就是这样: 分屏模式的适配 我们如何才能让自己的 APP 支持分屏模式呢? 若项目的 targetSDKVersion 大于等于24,那么可以在 AndroidManif

浅谈Android Studio 4.1 更新内容

概览 Android Studio 4.1 目前已经发布,该版本共修复了2370 个 bug 以及 275 个 issue,主要包含如下新增功能: 设计 Material Design 组件库的更新 开发 Database Inspector 功能 直接在 Android Studio 中运行模拟器 Dagger 导航支持 使用 TensorFlow Lite 模型 构建与测试 Android 模拟器支持折叠屏 Apply Changes 更新 从 AAR 中导出 C/C++ 中的依赖 Nati

浅谈iOS开发中static变量的三大作用

(1)先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void msg() { printf("Hello\n"); } 下面是main.c的内容 int main(void) { extern char a; // extern v