Android 开发代码复用

本文介绍了三种常见的代码复用方式:直接拷贝源码、使用jar包和将要复用的工程设置为Library。每种方式都有其优缺点,如直接拷贝不利于维护,而使用jar包则无法包含资源文件等。

1、获取源码拷贝到自己的工程。跟自己的代码没什么区别,不利于代码复用维护。

2、源码打包成jar包导入到自己的工程

优点:使用时不需要源代码,只需jar包即可

缺点:jar包里不包含资源

http://blog.youkuaiyun.com/hhhccckkk/article/details/9313999

3、要复用的源工程设置为Library工程,要使用的工程添加该工程

优点:可复用资源,且可方便查看修改被复用的模块

缺点:需要被复用模块源工程

http://blog.youkuaiyun.com/netpirate/article/details/8079130

<think>我们正在讨论Android开发中的代码复用方法和技术。根据提供的引用,我们可以总结出几种常见的代码复用方式: 1. **避免复制粘贴**:引用[1]提醒我们不要简单地复制粘贴代码,这样会导致代码冗余和维护困难。 2. **Activity栈复用**:引用[2]介绍了Activity的栈顶复用模式(当目标Activity在栈顶时直接复用,触发onNewIntent)和栈内复用的区别(不在栈顶则新建实例)。 3. **基类复用(继承)**:引用[3]展示了一个典型的基类复用例子,通过创建一个基类Fragment(BaseFragment)来封装公共的权限请求和检查方法,然后让其他Fragment继承它,从而复用代码。 4. **库项目复用**:引用[4]介绍了如何将老项目改造为库项目(library project)以便在新项目中复用。具体步骤包括修改build.gradle(将应用插件改为库插件)和移除applicationId。 除此之外,在Android开发中,还有其他常见的代码复用技术: 5. **工具类(Utils)**:创建包含静态方法的工具类,将常用的功能封装在其中,例如日期格式化、网络检查等。 6. **组合(Composition)**:通过将功能模块封装成独立的类,然后在需要的地方组合使用,而不是使用继承。这种方式更灵活,符合“组合优于继承”的原则。 7. **Android Library Module**:在Android Studio中创建库模块(Library Module),将可复用代码和资源放在其中,然后在多个应用中引用。 8. **AAR(Android Archive)**:将库模块打包成AAR文件,方便分发给其他开发者或项目使用。 9. **自定义View**:将重复使用的UI组件封装成自定义View,以便在布局中多次使用。 10. **使用依赖注入框架**:如Dagger或Hilt,通过依赖注入来复用服务和组件。 下面,我将详细解释其中几种方法: ### 1. 基类复用(继承) 如引用[3]所示,我们可以创建一个基类来封装公共代码。例如,多个Fragment可能需要相同的权限请求逻辑,我们可以将这些逻辑放在基类中: ```java public abstract class BaseFragment extends Fragment { protected boolean hasLocationPermission() { return ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; } protected void requestLocationPermission(int requestCode) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, requestCode); } } ``` 然后,具体的Fragment可以继承这个基类,并直接使用这些方法。 ### 2. 库项目复用 引用[4]介绍了如何将现有项目转换为库项目。步骤如下: 1. 修改build.gradle文件:将`apply plugin: 'com.android.application'`改为`apply plugin: 'com.android.library'`。 2. 删除或注释掉`applicationId`。 3. 调整AndroidManifest.xml:通常库项目的清单文件不需要设置启动Activity等应用配置。 然后,在其他项目中通过`implementation project(':library-module-name')`来引用这个库模块。 ### 3. 使用组合 组合是一种替代继承的复用方式。例如,我们可以将权限请求逻辑封装在一个单独的类中: ```java public class PermissionHelper { private Fragment fragment; public PermissionHelper(Fragment fragment) { this.fragment = fragment; } public boolean hasPermission(String permission) { return ContextCompat.checkSelfPermission(fragment.requireContext(), permission) == PackageManager.PERMISSION_GRANTED; } public void requestPermission(String permission, int requestCode) { fragment.requestPermissions(new String[]{permission}, requestCode); } } ``` 然后在Fragment中使用: ```java public class MyFragment extends Fragment { private PermissionHelper permissionHelper; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); permissionHelper = new PermissionHelper(this); if (!permissionHelper.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) { permissionHelper.requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, 1); } } } ``` ### 4. 创建工具类 工具类适用于封装与具体上下文无关的通用功能。例如: ```java public class StringUtils { public static boolean isEmpty(CharSequence str) { return str == null || str.length() == 0; } } ``` ### 5. 使用Android库模块 在Android Studio中创建库模块: 1. File -> New -> New Module -> Android Library。 2. 在库模块中编写可复用代码和资源。 3. 在主模块的build.gradle中添加依赖:`implementation project(':mylibrary')`。 ### 总结 Android开发代码复用的方法包括: - 继承基类(适用于有共同行为的组件,如Activity/Fragment) - 组合(将功能委托给其他类) - 工具类(静态方法) - 库模块(将代码打包成模块供多个项目使用) - 自定义View(复用UI组件) - 依赖注入(复用服务实例) 选择哪种方法取决于具体场景。通常,组合优于继承,因为它减少了类之间的耦合。对于跨项目的复用,库模块或AAR是更好的选择。 §§相关问题§§ 1. 在Android开发中,基类复用和组合复用各有什么优缺点? 2. 如何将Android应用模块转换为库模块? 3. 什么是AAR文件?如何使用它实现代码复用? 4. 除了代码复用,还有哪些方法可以提高Android开发效率? </think>以下是Android开发代码复用的主要方法和技术,结合引用内容及行业实践整理而成: ### 一、核心复用技术 1. **基类继承(OOP复用)** 创建包含公共逻辑的基类,子类直接继承复用代码: ```java public abstract class BaseFragment extends Fragment { protected void requestPermissions() { // 统一权限请求逻辑[^3] } } public class UserFragment extends BaseFragment { // 自动继承权限方法 } ``` 2. **库模块化(Library Modules)** - 修改`build.gradle`: ```gradle apply plugin: 'com.android.library' // 替换application插件[^4] // 移除applicationId ``` - 优点:可在多项目间复用完整组件(代码+资源) 3. **Activity启动模式复用** - `栈顶复用(singleTop)`:目标Activity在栈顶时直接复用实例,触发`onNewIntent()`[^2] - `栈内复用(singleTask)`:目标Activity在栈中存在时复用并清除其上所有Activity ### 二、进阶复用方案 4. **组合优于继承** ```kotlin class PaymentHandler(val context: Context) { fun process() { /* 支付逻辑 */ } } // 在Activity中组合使用 class OrderActivity : AppCompatActivity() { private val paymentHandler = PaymentHandler(this) } ``` 5. **工具类封装** ```java public class ViewUtils { public static void setupRecyclerView(RecyclerView rv) { rv.setLayoutManager(new LinearLayoutManager(rv.getContext())); rv.addItemDecoration(new DividerItemDecoration()); } } ``` 6. **自定义View组件** ```xml <com.example.ui.StandardToolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"/> ``` ### 三、现代复用技术 7. **Jetpack库复用** - 使用`ViewModel`复用业务逻辑 - 通过`LiveData`实现状态共享 - `WorkManager`复用后台任务 8. **依赖注入(DI)** ```kotlin @Module object NetworkModule { @Provides fun provideRetrofit(): Retrofit { /* 单例网络模块 */ } } ``` 9. **AAR二进制复用** 将库模块打包为`*.aar`文件,通过以下配置复用: ```gradle implementation files('libs/mylibrary.aar') ``` > **复用原则**:避免简单复制粘贴[^1],优先采用组件化设计。栈复用机制需注意`singleTop`和`singleTask`的行为差异[^2],库项目转换需确保清单文件兼容性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值