当前位置: 首页 > 面试题库 >

最佳做法:扩展或覆盖Android库项目类

贺懿轩
2023-03-14
问题内容

我们正在使用Android库项目在Android应用程序的不同内部版本(目标)之间共享核心类和资源。每个特定目标的Android项目都引用Core库项目(在幕后,Eclipse会从引用的库项目中创建并引用一个jar)。

覆盖资源(例如图像和XML布局)很容易。构建应用程序时,放置在目标项目中的资源文件(例如应用程序图标或XML布局)会自动覆盖具有相同名称的核心库资源。但是,有时需要重写一个类以启用特定于目标的行为。例如,Amazon目标首选项屏幕不能包含指向Google
Play应用页面的链接,这需要更改Amazon项目的preferences.xml和首选项Activity类。

目标是减少目标项目之间的重复代码数量,同时从Core库中删除尽可能多的特定于目标的代码。我们提出了几种方法来实现针对不同目标的逻辑:

  1. 在Core库类中编写特定于目标的函数,并使用if / switch块根据产品SKU选择行为。这种方法不是很模块化,并且夸大了Core库代码库。
  2. 在目标项目中扩展特定的Core类,并根据需要重写基类(Core)。然后在Core库中保留对基类对象的引用,并使用扩展的类对象对其进行实例化

还有其他策略可以覆盖或扩展Android库项目类吗?在Android应用目标之间共享和扩展通用类的最佳实践是什么?


问题答案:

库项目被引用为原始项目依赖项(基于源的机制),而不是已编译jar依赖项(基于已编译代码的库机制)。

@yorkw对于适用于Eclipse的ADT插件的最新版本不是这样, http://developer.android.com/sdk/eclipse-
adt.html

从版本17更改日志

新的构建功能添加了自动设置JAR依赖项的功能。/
libs文件夹中的所有.jar文件都将添加到构建配置中(类似于Ant构建系统的工作方式)。同样,库项目所需的.jar文件也会自动添加到依赖于那些库项目的项目中。(更多信息)

更多信息http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

在此之前,从库项目更新覆盖活动很容易,只需要排除该类即可。现在,该库作为jar文件包含在内,并且无法从jar依赖项中排除类文件。

编辑:

我从库jar覆盖/扩展Activity的解决方案:

我创建了一个简单的util类:

public class ActivityUtil {

private static Class getActivityClass(Class clazz) {

    // Check for extended activity
    String extClassName = clazz.getName() + "Extended";
    try {
        Class extClass = Class.forName(extClassName);
        return extClass;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        // Extended class is not found return base
        return clazz;
    }
}

public static Intent createIntent(Context context, Class clazz) {
    Class activityClass = getActivityClass(clazz);
    return new Intent(context, activityClass);
}
}

为了覆盖该库的“SampleActivity”类,它是一个依赖于该库的项目,请在同一包中的项目中创建一个名称为SampleActivityExtended的新类,并将新活动添加到您的AndroidManifest.xml中。

重要说明:所有引用覆盖活动的意图都应通过util类以以下方式创建:

Intent intent = ActivityUtil.createIntent(MainActivity.this, SampleActivity.class);
...
startActivity(intent);


 类似资料:
  • 问题内容: 在我一直在构建的应用程序中,我们相当依赖于SharedPreferences,这使我思考了访问SharedPreferences时的最佳实践。例如,许多人说通过此调用可以访问它: 但是,这似乎很危险。如果您有依赖于SharedPreferences的大型应用程序,则可能会有密钥重复,尤其是在使用某些也依赖SharedPreferences的第三方库的情况下。在我看来,更好的使用方法是:

  • 问题内容: 我正在尝试使用Swift协议扩展,却发现这种行为令人困惑。您能帮我得到我想要的结果吗? 请参阅代码最后4行的注释。(如果需要,可以将其复制粘贴到Xcode7游乐场)。谢谢!! 问题答案: 简短的答案是协议扩展不执行类多态性。这是有一定道理的,因为协议可以被结构或枚举采用,并且因为我们不希望仅在没有必要的地方采用协议来引入动态调度。 因此,在中,实例变量(可能更准确地写为)并不意味着您认

  • 问题内容: 这是一个现实的Angular问题,我无法解决。我喜欢Angular,但是这个问题现在困扰着我很多。 扩展现有控制器功能,并在应用程序的另一页上使用扩展控制器的最佳实践是什么?换句话说: 如何在Angular中继承控制器? 编辑 -2014年9月23日,不要以为我的原始用例的描述会帮助访问者更好地理解我在这里的用意。我认为这使人们偏离了真正的问题。 问题答案: 半年后,我想我完全了解发生

  • 问题内容: 我想知道构建和存储ID的最佳做法是什么。几年前,一位教授以社会保险号为例,向我讲述了身份证明系统构造不佳的危险。特别是,由于SSN没有错误检测功能,因此无法分辨9位数字的字符串和有效的SSN之间的区别。现在,政府机构需要“姓氏+ SSN”或“生日+ SSN”之类的信息来跟踪您的数据并确保对其进行验证。另外,根据您的出生地,您的社会保险号是可以预测的。 现在,我正在建立一个用户数据库…,

  • 所以我的问题是:我已经有一个标准布局的Android Studio项目和一个git存储库;加凌空应该怎么做?我应该下载到哪里?我应该怎么添加到Android Studio呢?我需要修改哪些分级文件(如果有的话)。 希望,对于那些已经做过几次的人,这应该是面包和黄油的东西,但我还没有找到一个直截了当的描述。 --

  • 问题内容: 如果我上课: 我最初以为我可以通过添加扩展名来覆盖子类而无需子类化: 该代码不会编译,但错误说明了该函数,这很有意义。 我的问题是: 是否仍要重写特定类的功能?换句话说,在某些情况下,例如上面的示例中,我可以替换功能吗?如果没有,是否有其他解决方法或方法来实现该行为(可能声明了另一个协议,idk) 现在,我考虑得更多了,我不得不说这是不可能的,因为是什么阻止某人重写任何标准库函数? 问