【问题标题】:Accessing Activity before it starts在 Activity 开始之前访问它
【发布时间】:2010-12-15 04:40:17
【问题描述】:

我正在使用 InstrumentationTestCase 类来对活动中的某些内容进行单元测试。

在启动此活动之前,我需要能够检查 SharedPreferences 的内容并对其进行编辑。

我不能使用 setUp 方法创建 Activity 并访问它的 SharedPreferences 对象来编辑它,然后在完成 setUp 方法之前关闭该 Activity,因为它显然正在锁定测试处理。

在测试中启动 Activity 后,我也无法访问 SharedPreferences,因为一旦启动 Activity,它就已经更改了 SharedPreferences 对象并根据它采取行动,在我有机会获得它的引用之前。

我之前显然也无法访问 SharedPreferences,因为我没有 Activity 对象...一旦我这样做,它就已经在执行代码并正在启动...

所以,我的问题是,在我通过 Intent 实际创建 Activity 之前,有什么方法可以访问该 Activity 的 SharedPreferences(和任何其他 Activity 信息)?

我无法将其更改为 ActivityInstrumentationTestCase2,因为我的测试在其进程中使用了第二个活动,因此我不能仅更改为此类并使用它的 setUp() 方法来访问 SharedPreferences。

【问题讨论】:

    标签: android junit


    【解决方案1】:

    我发现最好的更简单的方法是仅通过检测来执行此操作,而无需编辑应用程序的架构或任何访问属性。

    我通过这个实现了它:

    Instrumentation instrumentation = getInstrumentation();
    instrumentation.getTargetContext().getSharedPreferences(..);
    

    这样我可以在仪器启动任何 Activity 之前访问 SharedPreferences。

    无论如何,感谢所有帮助、提示和其他替代方法。

    【讨论】:

    • 你能解释一下你是在哪里做的吗?
    • 我已经有一段时间没有这样做了,但我是在扩展 InstrumentationTestCase 的测试类中进行的,在运行测试的方法之一中,在该方法启动之前活动。或者,我认为您也可以在测试类的 setUp 方法上执行此操作。
    【解决方案2】:

    嗯...坦率地告诉你.. 我无法想象你的场景。但是在应用程序中检查信息是否可行?

    创建一个扩展 android.app.Application 的类,并在 Manifests 子应用程序元素中指定类名。

    示例代码:

    import android.app.Application;
    
    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
    
            //try and access activity info here.
        }
    }
    

    当您的应用程序启动时,要执行的第一类方法是您的应用程序的 onCreate,并且具有任何活动的所有生命周期事件..

    您必须通过以下方式在 ma​​nifest定义扩展应用程序类:

    <application
        android:name=".MyApplication"
        android:label="@string/application_name">
    

    我希望这篇文章能给你一些概述。

    【讨论】:

    • 这仍然不能解决问题,因为我正在对活动进行单元测试。如果我有一个应用程序进行单元测试,这个应用程序还必须在启动时执行此 SharedPreferences 访问,或者启动当前正在执行它的 Activity。因此,在测试时,一旦我启动应用程序,我就会错过 SharedPreferences。除非有办法访问未启动的应用程序。不过谢谢。
    【解决方案3】:

    我没有尝试过,但是如果您将模式设置为 MODE_WORLD_READABLE 并且可能设置为 MODE_WORLD_WRITEABLE 而不是 MODE_PRIVATE,我认为您可以在测试活动开始之前从另一个应用程序访问共享首选项。

    您可能还可以在 apk 中使用不同的活动或服务,或者使用另一个建立共享用户 ID 并具有相同证书的 apk 来进行访问,而无需更改访问模式。

    【讨论】:

    • 不,你不能。您无法从其他应用访问私人数据。
    • 法尔马里,你错了。请参阅 MODE_WORLD_READABLE 的文档,该文档可用于使数据非私有。另外,请花点时间了解共享用户 ID 对底层 unix 级别的私有数据的作用。
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多