安卓学习(二)
字数 2077 2025-08-09 19:33:17
Android四大组件深入解析与实战教学
一、Activity(活动)
1. Activity基本概念
Activity是Android应用中用于表现功能的界面组件,一个APP通常由多个Activity组成,通过界面调用实现完整功能。
2. Activity创建流程
- 声明:必须在AndroidManifest.xml中声明所有Activity
- 继承:自定义Activity类必须继承Activity基类
public class MainActivity extends 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()
public class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("收到了"); } } - 在AndroidManifest.xml中声明
<receiver android:name=".Receiver"> <intent-filter> <action android:name="android.intent.action.name"/> </intent-filter> </receiver>
4. Notification(状态栏通知)
基本使用:
- 创建Notification对象
- 通过NotificationManager启动通知
- 更新通知内容
- 删除通知
通知参数设置:
// 新建状态栏通知
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. 反编译工具链
- dx.jar:将.class打包成.dex
dx --dex --output=output.dex input.class - Baksmali.jar:将.dex反汇编为.smali
java -jar baksmali.jar -o output/ input.dex - Smali.jar:将.smali回编译为.dex
java -jar smali.jar input/ -o output.dex
3. 破解实战案例
- 使用jadx-gui分析APK
- 定位关键方法调用
- 修改smali代码(如将支付失败改为支付成功)
- 回编译并重新签名APK
七、关键总结
- 四大组件必须声明:所有Activity、Service、BroadcastReceiver和ContentProvider都必须在AndroidManifest.xml中声明
- 生命周期管理:理解各组件的生命周期回调方法及调用时机
- 跨进程通信:ContentProvider是实现安全数据共享的标准方式
- 后台服务:Service适合执行不需要用户交互的后台任务
- 广播机制:有序广播和异步广播提供了灵活的事件通知机制
- 安全存储:根据数据类型和安全性要求选择合适的存储方式
- 逆向分析:掌握Dalvik字节码和反编译工具是安全分析的基础
通过深入理解Android四大组件的工作原理和交互方式,开发者可以构建出结构清晰、功能完善的Android应用,同时也能更好地进行安全分析和漏洞挖掘。