Android Studio 是 Google 官方推出的 Android 应用开发 IDE,它采用 Gradle 构建系统来管理项目。创建一个 Android 项目后,你会在项目文件夹中看到如下的目录结构:
/app
|-- /src
| |-- /main
| | |-- /java
| | | |-- com.example.myapp
| | | |-- /activities
| | | | |-- MainActivity.java
| | | |-- /fragments
| | | | |-- MyFragment.java
| | | |-- /model
| | | | |-- DataModel.java
| | | |-- /util
| | | |-- UtilityClass.java
| | |-- /res
| | |-- /drawable
| | | |-- ic_launcher.png
| | |-- /layout
| | | |-- activity_main.xml
| | | |-- fragment_my.xml
| | |-- /values
| | |-- strings.xml
| |-- /build
|-- /gradle
|-- build.gradle
|-- settings.gradle
|-- AndroidManifest.xml
/app
目录这是 Android 项目的主要目录,包含所有模块的代码、资源和配置文件。
/src
目录/src
目录包含应用的源代码和资源文件,一般有 /main
和 /test
两个子目录。
/main
: 包含主要的应用代码和资源文件。
/java
: Java 源代码目录。
/com/example/myapp
: 这是默认的 Java 包名。你应该将自己的包名替换成这里。
/activities
: 存放所有 Activity 类的目录。
MainActivity.java
: 主界面的 Activity 类。/fragments
: 存放所有 Fragment 类的目录。
MyFragment.java
: 自定义的 Fragment 类。/model
: 存放数据模型类。
DataModel.java
: 存放数据模型的类。/util
: 存放工具类。
UtilityClass.java
: 存放一些工具方法的类。/res
: 存放应用的资源文件。
/drawable
: 存放图像资源。
ic_launcher.png
: 应用图标。/layout
: 存放布局文件。
activity_main.xml
: 主界面布局文件。fragment_my.xml
: 自定义 Fragment 的布局文件。/values
: 存放字符串、颜色等资源。
strings.xml
: 存放字符串资源。/build
目录构建过程中生成的文件都在这里,包括编译的类文件、APK 文件等。通常不需要手动操作这个目录。
/gradle
目录Gradle 构建系统的配置文件和脚本存放在这个目录下。
build.gradle
文件这是整个项目的构建文件,包含了项目的依赖关系和配置信息。
settings.gradle
文件这个文件包含有关项目的设置信息,如模块的命名等。
AndroidManifest.xml
文件这是 Android 应用的清单文件,包含了应用的基本信息,如权限声明、组件声明等。
MainActivity.java
- 主界面的 Activity 类MainActivity.java
是应用的主界面,是用户与应用进行交互的入口点。下面是一个简单的示例:
package com.example.myapp.activities;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 在这里进行一些初始化操作
}
}
AppCompatActivity
: 是 Activity
类的一个子类,提供了向后兼容的支持,使应用在旧版本的 Android 上也能正常运行。
onCreate(Bundle savedInstanceState)
: 是生命周期方法,当 Activity 创建时调用。在这里,你可以进行初始化操作,如设置布局、绑定事件等。
activity_main.xml
- 主界面的布局文件activity_main.xml
是主界面的布局文件,定义了用户界面的结构。以下是一个简单的示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
RelativeLayout
: 是一个布局容器,内部的子元素可以相对于父容器或者彼此进行定位。
TextView
: 是一个显示文本的视图元素。
MyFragment.java
- 自定义 Fragment 类Fragment 是可以嵌套到 Activity 中的模块化 UI 组件,增加了界面的灵活性。以下是一个简单的示例:
package com.example.myapp.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 在这里加载 Fragment 的布局文件
return inflater.inflate(R.layout.fragment_my, container, false);
}
}
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
: 当 Fragment 创建视图时调用。在这里,你可以加载 Fragment 的布局文件。fragment_my.xml
- Fragment 的布局文件fragment_my.xml
是 Fragment 的布局文件,定义了 Fragment 的用户界面。以下是一个简单的示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is my custom Fragment!" />
</LinearLayout>
LinearLayout
: 是一个线性布局容器,子元素可以按照水平或垂直的方式排列。在 Android 中,Intent 是一种用于在组件之间传递消息的对象。它主要用于启动组件(如启动 Activity、启动 Service)或者在组件之间传递数据。Intent 主要分为两种类型:
显式 Intent: 明确定义了要启动的组件,通常用于在同一个应用内启动其他组件。
Intent explicitIntent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(explicitIntent);
隐式 Intent: 没有直接指定要启动的组件,而是定义了要执行的操作,允许系统选择匹配的组件。
Intent implicitIntent = new Intent("com.example.ACTION_START");
startActivity(implicitIntent);
在这个例子中,“com.example.ACTION_START” 是一个自定义的操作字符串,对应的组件会根据这个操作来响应。
为了接收隐式 Intent,组件需要在清单文件中声明 Intent Filter。这样,当有匹配的 Intent 发送时,系统可以找到并启动相应的组件。
<activity android:name=".TargetActivity">
<intent-filter>
<action android:name="com.example.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在这个例子中,TargetActivity
声明了一个 Intent Filter,它匹配了操作字符串 “com.example.ACTION_START”。这样,当发送一个带有这个操作的 Intent 时,系统就会找到并启动 TargetActivity
。
除了启动组件,Intent 还可以用于在组件之间传递数据。这可以通过在 Intent 中添加额外的信息实现。
// 发送带有数据的 Intent
Intent intentWithData = new Intent(CurrentActivity.this, TargetActivity.class);
intentWithData.putExtra("key", "value");
startActivity(intentWithData);
在目标组件中,可以使用 getIntent()
方法获取接收到的 Intent,并从中提取数据。
// 接收传递过来的数据
Intent receivedIntent = getIntent();
String value = receivedIntent.getStringExtra("key");
在使用 Intent 启动组件或者声明 Intent Filter 时,需要在 AndroidManifest.xml
文件中做相应的配置。
<!-- 启动 Activity 的声明 -->
<activity android:name=".TargetActivity">
<!-- ... -->
</activity>
<!-- Intent Filter 的声明 -->
<activity android:name=".TargetActivity">
<intent-filter>
<!-- ... -->
</intent-filter>
</activity>
AndroidManifest.xml
中的配置信息告诉系统如何处理 Intent,包括启动哪个组件、如何匹配 Intent Filter 等。
Android 的布局系统是构建用户界面的基础。它使用 XML 文件定义应用界面的结构,同时支持多种布局和控件。以下是 Android 常用的一些布局:
LinearLayout: 线性布局,可以设置子元素水平或垂直排列。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 子元素放在这里 -->
</LinearLayout>
RelativeLayout: 相对布局,可以根据其他元素的位置定位子元素。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 子元素放在这里 -->
</RelativeLayout>
ConstraintLayout: 约束布局,通过设置子元素之间的约束关系来定义界面。
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 子元素放在这里 -->
</androidx.constraintlayout.widget.ConstraintLayout>
FrameLayout: 帧布局,所有的子元素都会叠加在左上角,可以用于简单的叠加效果。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 子元素放在这里 -->
</FrameLayout>
Android 提供了许多预定义的控件,用于构建用户界面。以下是一些常用的控件:
TextView: 用于显示文本。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
EditText: 用于接收用户输入的文本。
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter your text" />
Button: 用于响应用户点击事件。
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me" />
ImageView: 用于显示图像。
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
在布局文件中,通常使用 dp
(density-independent pixels)作为尺寸单位,以确保在不同设备上显示一致的大小。示例:
<TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:text="Size in dp" />
为了提高代码的可维护性,Android 使用资源文件来存储字符串、颜色、图像等。这些资源文件位于 /res
目录下,可以在布局文件中引用。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_text"
android:textColor="@color/text_color" />
在 /res/values
目录下的 strings.xml
和 colors.xml
中分别定义了字符串和颜色的资源。
SharedPreferences
是 Android 提供的一种轻量级的数据存储方式,用于存储键值对数据。它通常用于存储简单的配置信息、用户偏好设置等。以下是一个简单的使用示例:
// 获取 SharedPreferences 对象
SharedPreferences preferences = getSharedPreferences("my_preferences", Context.MODE_PRIVATE);
// 存储数据
SharedPreferences.Editor editor = preferences.edit();
editor.putString("username", "john_doe");
editor.putInt("user_age", 25);
editor.apply();
// 读取数据
String username = preferences.getString("username", "default_username");
int age = preferences.getInt("user_age", 0);
Android 应用可以通过文件存储来保存和读取数据。以下是一个使用文件存储的示例:
// 获取应用内部存储目录
File internalStorageDir = getFilesDir();
// 创建文件
File file = new File(internalStorageDir, "my_data.txt");
// 写入数据
try {
FileWriter writer = new FileWriter(file);
writer.write("Hello, this is my data!");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
// 读取数据
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String data = reader.readLine();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
SQLite 是 Android 中内置的关系型数据库系统,常用于存储结构化数据。以下是一个简单的 SQLite 数据库操作示例:
// 创建或打开数据库
SQLiteDatabase database = openOrCreateDatabase("my_database", MODE_PRIVATE, null);
// 创建表
database.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
// 插入数据
database.execSQL("INSERT INTO users (name, age) VALUES ('John Doe', 25)");
// 查询数据
Cursor cursor = database.rawQuery("SELECT * FROM users", null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
}
// 关闭数据库连接
database.close();
Room 是 Google 推荐的一种持久化库,它提供了更高级的抽象,简化了 SQLite 数据库的操作。以下是 Room 的一些基本用法:
// 创建实体类
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "name")
public String name;
@ColumnInfo(name = "age")
public int age;
}
// 创建数据库访问对象 (DAO)
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM user")
List<User> getAllUsers();
}
// 创建数据库
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
// 使用 Room 数据库
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "my-database").build();
User user = new User();
user.name = "John Doe";
user.age = 25;
db.userDao().insert(user);
List<User> users = db.userDao().getAllUsers();
Room 的使用能够简化数据库的操作,并提供更高级的数据库抽象层。
Android 项目通常包括 /app
、/src
、/build
、/gradle
等目录,其中 /src
下包含了主要的代码和资源文件。
Activity 是 Android 应用中用户界面的一个组成部分,而 Fragment 则是可以嵌套到 Activity 中的模块化 UI 组件。
Intent 用于在组件之间传递消息,可以启动组件或在组件之间传递数据。有显式 Intent 和隐式 Intent 两种类型。
Android 的布局系统使用 XML 文件定义用户界面的结构,支持多种布局和控件,包括 LinearLayout、RelativeLayout、ConstraintLayout 等。
Android 提供了多种持久化存储方式,包括 SharedPreferences、文件存储、SQLite 数据库和 Room 持久化库。
Android 应用中通常需要进行一些耗时的操作,为了避免阻塞主线程,需要使用多线程和异步任务的机制。
与服务器进行数据交互是许多应用的必备功能,可以使用 Android 提供的 HttpURLConnection 或第三方库(如 Retrofit)来进行网络请求。
数据绑定是一种通过声明性布局文件绑定 UI 组件和应用数据的方式,可以简化 UI 更新的过程。
有些应用需要特殊的权限或者在后台执行任务,需要了解 Android 的权限系统和服务机制。
Material Design 是 Google 推出的设计语言,用于创建现代、美观的用户界面。掌握 Material Design 可以提高应用的用户体验。
深入了解 Gradle 构建系统,可以更灵活地配置项目依赖、构建规则等。
Android Jetpack 是一个由 Google 提供的库集合,其中包含了许多用于简化 Android 应用开发的组件,如 Navigation、ViewModel、LiveData 等。