安卓学习(二)
字数 2077 2025-08-09 19:33:17

Android四大组件深入解析与实战教学

一、Activity(活动)

1. Activity基本概念

Activity是Android应用中用于表现功能的界面组件,一个APP通常由多个Activity组成,通过界面调用实现完整功能。

2. Activity创建流程

  1. 声明:必须在AndroidManifest.xml中声明所有Activity
  2. 继承:自定义Activity类必须继承Activity基类
    public class MainActivity extends Activity
    

3. Activity生命周期

运行过程:

  1. onCreate():活动第一次创建时调用,完成初始化操作
  2. onStart():活动由不可见变为可见时调用
  3. onResume():活动准备好与用户交互时调用,位于返回栈栈顶

销毁过程:

  1. onPause():系统准备启动/恢复另一个活动时调用
  2. onStop():活动完全不可见时调用
  3. onDestroy():活动被销毁前调用
  4. onRestart():活动由停止状态变为运行状态前调用

二、Service(服务)

1. Service基本概念

  • 后台运行服务,不提供界面呈现
  • 应用退出时Service仍可在后台运行
  • 典型应用场景:播放音乐、定时更新数据等

2. Service生命周期

startService启动方式:

  • 生命周期:onCreate -> onStartCommand
  • 停止:直接调用onDestroy
  • 特点:调用者不stopService则一直运行

bindService启动方式:

  • 生命周期:onCreate -> onBind
  • 解绑:onUnbind -> onDestroy
  • 特点:与调用者共存亡

三、Broadcast Receiver(广播接收者)

1. 广播接收者基本概念

  • 用于接收系统或应用广播并做出响应
  • 四大用途:短信接收、网络状态变化、电池电量变化等

2. 广播类型

  1. 普通广播:Context.sendBroadcast()
  2. 有序广播:Context.sendOrderedBroadcast()
  3. 异步广播:Context.sendStickyBroadcast()

3. 广播接收实现步骤

  1. 继承BroadcastReceiver并重写onReceive()
    public class Receiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("收到了");
        }
    }
    
  2. 在AndroidManifest.xml中声明
    <receiver android:name=".Receiver">
        <intent-filter>
            <action android:name="android.intent.action.name"/>
        </intent-filter>
    </receiver>
    

4. Notification(状态栏通知)

基本使用:

  1. 创建Notification对象
  2. 通过NotificationManager启动通知
  3. 更新通知内容
  4. 删除通知

通知参数设置:

// 新建状态栏通知
Notification baseNF = new Notification();
// 设置图标
baseNF.icon = R.drawable.icon; 
// 设置状态栏显示内容
baseNF.tickerText = "You clicked BaseNF!";
// 设置默认参数
baseNF.defaults = Notification.DEFAULT_SOUND;
// 设置通知内容
baseNF.setLatestEventInfo(context, "Title", "Content", pendingIntent);
// 发出通知
notificationManager.notify(id, baseNF);

四、Content Provider(内容提供者)

1. 内容提供者基本概念

  • 用于不同应用间数据共享
  • 提供安全的数据访问机制
  • 标准URI格式:content://authority/path

2. ContentResolver使用

查询数据:

Cursor cursor = getContentResolver().query(
    uri,          // 内容URI
    projection,   // 查询列名
    selection,    // WHERE条件
    selectionArgs,// 条件参数
    sortOrder     // 排序方式
);

添加数据:

ContentValues values = new ContentValues();
values.put("column1", "text");
getContentResolver().insert(uri, values);

修改数据:

ContentValues values = new ContentValues();
values.put("column1", "new text");
getContentResolver().update(uri, values, "column1=?", new String[]{"old text"});

删除数据:

getContentResolver().delete(uri, "column2=?", new String[]{"1"});

五、数据存储方式

1. SharedPreferences

  • 基于XML的key-value存储
  • 存储路径:/data/data/shared_prefs/
  • 获取实例:getSharedPreferences()

2. 文件存储

  • 基本文件操作:openFileInput()openFileOutput()
  • 文件操作模式:MODE_PRIVATE、MODE_APPEND

3. SQLite数据库

  • 轻量级关系型数据库
  • 通过SQLiteOpenHelper管理数据库
  • 创建数据库帮助类:
    public class MyDatabaseHelper extends SQLiteOpenHelper {
        public MyDatabaseHelper(Context context, String name, 
                              CursorFactory factory, int version) {
            super(context, name, factory, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 创建表
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 升级数据库
        }
    }
    

4. 网络数据存储

HttpURLConnection使用:

// GET请求
URL url = new URL("http://www.example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);

// POST请求
conn.setRequestMethod("POST");
OutputStream out = conn.getOutputStream();
out.write("key=value".getBytes());

六、Dalvik字节码与反编译

1. Dalvik寄存器

  • 32位寄存器,64位使用两个相邻寄存器
  • 命名法:
    • v命名法:v0-vn为局部变量寄存器
    • p命名法:p0-pn为参数寄存器

2. 反编译工具链

  1. dx.jar:将.class打包成.dex
    dx --dex --output=output.dex input.class
    
  2. Baksmali.jar:将.dex反汇编为.smali
    java -jar baksmali.jar -o output/ input.dex
    
  3. Smali.jar:将.smali回编译为.dex
    java -jar smali.jar input/ -o output.dex
    

3. 破解实战案例

  1. 使用jadx-gui分析APK
  2. 定位关键方法调用
  3. 修改smali代码(如将支付失败改为支付成功)
  4. 回编译并重新签名APK

七、关键总结

  1. 四大组件必须声明:所有Activity、Service、BroadcastReceiver和ContentProvider都必须在AndroidManifest.xml中声明
  2. 生命周期管理:理解各组件的生命周期回调方法及调用时机
  3. 跨进程通信:ContentProvider是实现安全数据共享的标准方式
  4. 后台服务:Service适合执行不需要用户交互的后台任务
  5. 广播机制:有序广播和异步广播提供了灵活的事件通知机制
  6. 安全存储:根据数据类型和安全性要求选择合适的存储方式
  7. 逆向分析:掌握Dalvik字节码和反编译工具是安全分析的基础

通过深入理解Android四大组件的工作原理和交互方式,开发者可以构建出结构清晰、功能完善的Android应用,同时也能更好地进行安全分析和漏洞挖掘。

Android四大组件深入解析与实战教学 一、Activity(活动) 1. Activity基本概念 Activity是Android应用中用于表现功能的界面组件,一个APP通常由多个Activity组成,通过界面调用实现完整功能。 2. Activity创建流程 声明 :必须在AndroidManifest.xml中声明所有Activity 继承 :自定义Activity类必须继承Activity基类 3. Activity生命周期 运行过程: onCreate() :活动第一次创建时调用,完成初始化操作 onStart() :活动由不可见变为可见时调用 onResume() :活动准备好与用户交互时调用,位于返回栈栈顶 销毁过程: onPause() :系统准备启动/恢复另一个活动时调用 onStop() :活动完全不可见时调用 onDestroy() :活动被销毁前调用 onRestart() :活动由停止状态变为运行状态前调用 二、Service(服务) 1. Service基本概念 后台运行服务,不提供界面呈现 应用退出时Service仍可在后台运行 典型应用场景:播放音乐、定时更新数据等 2. Service生命周期 startService启动方式: 生命周期:onCreate -> onStartCommand 停止:直接调用onDestroy 特点:调用者不stopService则一直运行 bindService启动方式: 生命周期:onCreate -> onBind 解绑:onUnbind -> onDestroy 特点:与调用者共存亡 三、Broadcast Receiver(广播接收者) 1. 广播接收者基本概念 用于接收系统或应用广播并做出响应 四大用途:短信接收、网络状态变化、电池电量变化等 2. 广播类型 普通广播 :Context.sendBroadcast() 有序广播 :Context.sendOrderedBroadcast() 异步广播 :Context.sendStickyBroadcast() 3. 广播接收实现步骤 继承BroadcastReceiver并重写onReceive() 在AndroidManifest.xml中声明 4. Notification(状态栏通知) 基本使用: 创建Notification对象 通过NotificationManager启动通知 更新通知内容 删除通知 通知参数设置: 四、Content Provider(内容提供者) 1. 内容提供者基本概念 用于不同应用间数据共享 提供安全的数据访问机制 标准URI格式: content://authority/path 2. ContentResolver使用 查询数据: 添加数据: 修改数据: 删除数据: 五、数据存储方式 1. SharedPreferences 基于XML的key-value存储 存储路径:/data/data/shared_ prefs/ 获取实例: getSharedPreferences() 2. 文件存储 基本文件操作: openFileInput() 和 openFileOutput() 文件操作模式:MODE_ PRIVATE、MODE_ APPEND 3. SQLite数据库 轻量级关系型数据库 通过SQLiteOpenHelper管理数据库 创建数据库帮助类: 4. 网络数据存储 HttpURLConnection使用: 六、Dalvik字节码与反编译 1. Dalvik寄存器 32位寄存器,64位使用两个相邻寄存器 命名法: v命名法:v0-vn为局部变量寄存器 p命名法:p0-pn为参数寄存器 2. 反编译工具链 dx.jar :将.class打包成.dex Baksmali.jar :将.dex反汇编为.smali Smali.jar :将.smali回编译为.dex 3. 破解实战案例 使用jadx-gui分析APK 定位关键方法调用 修改smali代码(如将支付失败改为支付成功) 回编译并重新签名APK 七、关键总结 四大组件必须声明 :所有Activity、Service、BroadcastReceiver和ContentProvider都必须在AndroidManifest.xml中声明 生命周期管理 :理解各组件的生命周期回调方法及调用时机 跨进程通信 :ContentProvider是实现安全数据共享的标准方式 后台服务 :Service适合执行不需要用户交互的后台任务 广播机制 :有序广播和异步广播提供了灵活的事件通知机制 安全存储 :根据数据类型和安全性要求选择合适的存储方式 逆向分析 :掌握Dalvik字节码和反编译工具是安全分析的基础 通过深入理解Android四大组件的工作原理和交互方式,开发者可以构建出结构清晰、功能完善的Android应用,同时也能更好地进行安全分析和漏洞挖掘。