Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Android库调用非库代码_Android_Reflection_Android Library_Static Initialization - Fatal编程技术网

从Android库调用非库代码

从Android库调用非库代码,android,reflection,android-library,static-initialization,Android,Reflection,Android Library,Static Initialization,自从Android引入库项目以来,我一直在将我的应用程序转换成一个库,这样我就可以通过适当的调整来制作多个版本(例如,使用相同代码库的免费版和专业版,但需要做一些更改) 我最初在允许库项目的代码访问子项目中的字段时遇到了问题。换句话说,我的免费版和专业版都有一个类,其中包含一些常量,库项目将使用这些常量来区分某些特性 在子项目中,我扩展了库的主要活动,并添加了一个静态初始化块,该块使用反射来更改库中字段的值 public class MyMainActivityProVersion extend

自从Android引入库项目以来,我一直在将我的应用程序转换成一个库,这样我就可以通过适当的调整来制作多个版本(例如,使用相同代码库的免费版和专业版,但需要做一些更改)

我最初在允许库项目的代码访问子项目中的字段时遇到了问题。换句话说,我的免费版和专业版都有一个类,其中包含一些常量,库项目将使用这些常量来区分某些特性

在子项目中,我扩展了库的主要活动,并添加了一个静态初始化块,该块使用反射来更改库中字段的值

public class MyMainActivityProVersion extends MyMainActivity {

    public static final String TAG = Constants.APP_NAME + "/SubClass";

    static {
        try {
            ConstantsHelper.setConstants(Constants.class);
        } catch (Exception e) {
            Log.d(TAG, "--- Constants not initialised! ---");
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
在这段代码中,ConstantsHelper位于库中,我从我的子项目中提供Constants.class。这将初始化库项目中的常量

我的方法非常有效,除了一个特定的用例。当应用程序有一段时间没有使用并且被操作系统“停止”时,ConstantHelper中的静态字段将被遗忘

常量应该由主活动重置(如上所示),但主活动甚至没有启动,因为操作系统恢复了不同的活动。这样做的结果是忘记了常量的初始化,我无法重新初始化它们,因为恢复的活动在库中(库中不知道子项目)

我如何“告诉”库中的其他活动在恢复时调用子项目中的代码?或者,是否有办法确保在每份简历中调用我的子项目中的某些代码?

我认为你试图通过静态成员在两个活动中共享数据是在“作弊”。当它们在相同或相关的类加载器中时,这种情况就会发生。在这里,我相信Android使用单独的类加载器进行单独的活动,但是,子活动在子类加载器中。因此,
ViewActivity
恰好能够查看父类加载器,并查看父类的静态。后来,我相信家长离开了,所以当您下次访问它时,您的孩子会在本地重新加载
MyMainActivity
,但它并没有按照您希望的那样初始化。(好吧,如果不是这样的话,那就是这个解释。)


我认为还有一些更可靠的替代方案。您可以使用
LicenseChecker
API来决定是免费版还是付费版,而不是依赖活动生命周期和类加载器的详细信息。这可能会更好,因为它可以保护您免受其他类型的未经授权的使用。

恐怕我从未找到这个问题的好答案。我可能会继续糟糕地使用反射,并找出一些骇人的解决方法


我觉得我应该回来,至少要指出,我解决这个问题并不是为了其他来到这个页面的人的利益。

你可以使用Android资源来解决这个问题。 基本上,在库项目的资源xml值文件中定义常量
例如,“lib项目”\values\constants.xml

<resources xmlns:tools="http://schemas.android.com/tools">
   <bool name="const_free_version">false</bool>
   <string name="const_a_constant">pippo</bool>
</resources>
<resources xmlns:tools="http://schemas.android.com/tools">
   <bool name="const_free_version">true</bool>
</resources>

错误的
皮波
然后,在子项目中,可以使用不同的资源xml值文件重新定义lib项目值:
例如,“子项目”\values\constants.xml

<resources xmlns:tools="http://schemas.android.com/tools">
   <bool name="const_free_version">false</bool>
   <string name="const_a_constant">pippo</bool>
</resources>
<resources xmlns:tools="http://schemas.android.com/tools">
   <bool name="const_free_version">true</bool>
</resources>

符合事实的
在lib项目代码中,当您参考R.bool.const_free_版本时,您将根据子项目常量值xml获得实际值。

请注意,您不必重新定义lib project constants.xml中定义的每个值,而只需重新定义子项目中需要的不同值。

我可能能够解释类加载器中发生的情况,但我还不能完全理解--“库中恢复的活动”是什么意思?这是
MyMainActivityProVersion
,对,它在你的应用程序中。忘记常量是什么意思?MyMainActivity继续调用其他一些活动,在本例中是ViewerActivity,它位于库项目中。如果用户处于ViewerActivity,然后按“home”,则应用程序最终将关闭,并且ConstantHelper中的常量必须重新初始化。它们不会被重新初始化,因为当用户恢复应用程序时,恢复的活动是ViewerActivity,并且上面我的重要代码没有被执行,所以常量值不仅仅用于ProVersionActivity?您知道应用程序类吗?无论启动的“子活动”是什么,它都将创建一次。是的,常量需要在库项目中的许多活动中共享。我不能使用应用程序类,因为它与我的方法有完全相同的问题:它在活动暂停时工作,但在活动被OSI终止时不工作。你可能误解了情况(我不怪你,阅读文本解释很难)。我不是在活动中共享静态成员,它们是通过库中的常量类共享的,该类由子项目的活动“填充”有用的信息。然后,图书馆的所有活动都可以访问它。但是,当应用程序被操作系统终止时,constants类是“未初始化的”,我无法让库项目“查看”子项目以及其中填充这些常量的代码。这是我的问题,我可能误解了,但是您描述的内容听起来仍然像是依赖于与类本身相关的东西,而不是对象或实例。一个类不能“取消初始化”——但是你肯定会在一个新的类加载器中重新加载这个类,或者发现你自己创建了一个新的单例或其他东西,原因我已经给出了。这仍然可能是一个转移视线的问题——必须看代码——但希望这能澄清这个想法是否相关。