Доступ к активности до ее запуска

Я использую класс InstrumentationTestCase для unit test некоторых вещей внутри действия.

Мне нужно уметь проверять содержимое SharedPreferences и редактировать их до запуска этого действия.

Я не могу использовать метод setUp для создания Activity и доступа к его объекту SharedPreferences для его редактирования, а затем закрыть это действие до завершения метода setUp, поскольку он, по-видимому, блокирует обработку тестов.

Я также не могу получить доступ к SharedPreferences после того, как я запустил действие внутри теста, потому что как только действие будет запущено, оно уже изменит объект SharedPreferences и будет действовать согласно ему, прежде чем у меня появится возможность получить его ссылку.

Я, видимо, не могу получить доступ к SharedPreferences до этого, потому что у меня нет объекта Activity... и как только я это сделаю, он уже выполняет код и запускается...

Итак, мой вопрос заключается в том, есть ли способ доступа к SharedPreferences (и любой другой информации о деятельности) для этой операции до того, как у меня есть действие, фактически созданное посредством Intent?

Я не могу изменить его на ActivityInstrumentationTestCase2, потому что мой тест использует второе действие в нем, поэтому я не могу просто изменить этот класс и использовать его метод setUp() для доступа к SharedPreferences.

Ответ 1

Я нашел лучший простой способ сделать это только с помощью инструментария, без необходимости редактировать архитектуру приложения или любые атрибуты доступа.

Я достиг этого:

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

Таким образом, я могу получить доступ к SharedPreferences, прежде чем всякая активность будет запущена с помощью инструментария.

Спасибо за помощь, подсказки и другие альтернативы.

Ответ 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.
    }
}

Когда ваше приложение запущено, метод первого класса для execture находится onCreate вашего приложения и имеет все события lifecyle активности любого вида деятельности.

Вы должны определить расширенный класс приложения в манифеста:

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

Я надеюсь, что это даст вам обзор.

Ответ 3

Я не пробовал, но если вы установите режим MODE_WORLD_READABLE и, возможно, MODE_WORLD_WRITEABLE вместо MODE_PRIVATE, я бы подумал, что вы можете получить доступ к общим предпочтениям из другого приложения до запуска тестируемой операции.

Возможно, вы также можете использовать другое действие или службу в apk или другой apk, который устанавливает общий идентификатор пользователя и имеет тот же сертификат, чтобы сделать доступ без изменения режима доступа.