onActivityResult вне области действия

#android #pojo

#Android #pojo

Вопрос:

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

Некоторые функции требуют вызова некоторых действий и зависят от результата. Мои классы POJO получают ссылку на вызывающее действие при использовании, но это происходит во время выполнения, и я не могу контролировать реализацию этих действий.

Моя проблема в том, что со ссылкой на вызывающее действие я могу запустить activityforresult, но у меня нет способа добавить onActivityResult , который может существовать в вызывающем действии, но не знает о коде запроса, который я использовал.

Тогда мой вопрос заключается в том, как я узнаю из обычного объекта Java, когда действие вернулось? поскольку, насколько я понимаю, я могу реализовать onActivityResult только для классов Activity.

Спасибо!

Ответ №1:

У вас будет немало проблем с этой настройкой, но именно так вы можете начать:

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

 class Pojo {
    static final ConditionVariable gate = new ConditionVariable();
    static int resu<

    int m(Context context) {
        context.startActivity(new Intent(context, ForwarderActivity.class));
        gate.block();
        return resu<
    }
}

class ForwarderActivity extends Activity {
    private boolean started = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!started) {
            started = true;
            startActivityForResult(new Intent("ContactsProvider"), 1);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Pojo.result = resultCode;
        Pojo.gate.open();
    }
}
  

Однако есть пара проблем. Например, ваш метод POJO не может быть вызван из основного потока (пользовательского интерфейса), потому что вам нужно преобразовать асинхронный вызов (startActivityForResult() ) в синхронный (Pojo.m()), и действие, от которого вы хотите получать информацию, будет запущено в основном потоке, поэтому выне удается заблокировать его в Pojo.m()…

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

Ответ №2:

у меня такая же проблема, когда я играю с UNITY3D, у unity есть своя собственная активность (unity player), я по какой-то причине не хочу ее редактировать. но активность игрока ничего не делает внутри функции «onActivityResult». И мне нужно кое-что сделать, когда я получаю доступ к средству выбора изображений, я могу вызвать «UnityPlayer.startActivityForResult», чтобы открыть средство выбора изображений, но НЕТ СПОСОБА ЗАКОДИРОВАТЬ СВОЙ СОБСТВЕННЫЙ «onActivityResult».

я думаю, мы надеемся, что это что-то вроде этого:

OtherActivityClass.onActivityResultListener=function(){My Own CODE}..........OR
OtherActivityClass.onActivityResultListener.add(myResultListener)..................

Ответ №3:

Тогда мой вопрос заключается в том, как я узнаю из обычного объекта Java, когда действие вернулось?

Пусть действие вызывает POJO, предоставляя результат.

Мои классы POJO получают ссылку на вызывающее действие при использовании, но это происходит во время выполнения, и я не могу контролировать реализацию этих действий.

Тогда тот, кто «контролирует выполнение этих действий», должен будет заставить activity вызывать POJO, предоставляя результат. Это ничем не отличается от любого другого механизма обратного вызова / прослушивания.

Комментарии:

1. Ну, у меня есть некоторые неприятные ограничения, с которыми мне нужно разобраться.. все, что когда-либо использует мой POJO, для меня похоже на черный ящик, все, что я знаю, это то, что он вызывает методы в моих POJO и, в свою очередь, ожидает результата. Что касается действий, которые я хочу вызвать из моего POJO, это действия, существующие на устройстве Android, которые также находятся вне моего контроля.. Мне просто нужно позвонить им (скажем, получить контакт) и получить результат. Спасибо.

2. @Nitzan Tomer: «У меня есть некоторые неприятные ограничения, с которыми мне нужно разобраться» — эти ограничения необходимо будет снять. Вы не можете использовать startActivityForResult() , кроме как из какой-либо вашей деятельности, где вы реализуете onActivityResult() .

Ответ №4:

Может быть, PendingIntent http://developer.android.com/reference/android/app/PendingIntent.html могу помочь вам в этом. Я все еще ищу решение своей проблемы, и для меня этот класс выглядит довольно многообещающим.

Другим способом может быть создание собственного абстрактного класса и метод onActivityResult , который необходимо переопределить. Конечно, вам придется полагаться на JavaDoc и «пожалуйста, вызовите super.onActivityResult», чтобы иметь возможность обрабатывать результат в вашем коде. Но если пользователи вашего класса хотят добиться некоторого успеха с вашим кодом, они должны следовать вашим инструкциям JavaDoc.

Ответ №5:

Подобно тому, что предлагает Сабольч Береч, это возможно. Красивого решения не существует, но возможно следующее:

  • создайте простое действие без просмотра, которое запускает для вас намерение
  • распределите результат через глобальный менеджер прослушивателей, где заинтересованные классы могут самостоятельно регистрироваться и отменять регистрацию (например, POJO)
  • это неблокирующее, но startActivityForResult и ожидание его результата вообще не блокируется

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