Как общаться между действиями в Android - PullRequest
0 голосов
/ 24 марта 2020

Я новичок в Android (но не в java), и меня смущают Сервисы, ViewModel, Broadcast и другие альтернативы, используемые для связи между Деятельностями. Мои потребности в общении чрезвычайно основны c.

Рассмотрим Midiscope * MainActivity . Я хочу сделать что-то подобное, но с помощью Spinner, чтобы выбрать источник в другом действии. В основном одно действие для Spinner (назовите его «SettingsActivity», но, очевидно, не может быть истинными настройками по причинам, слишком длинным для этого поля), и другое действие для пользовательского интерфейса с TextView, назовите его TextViewActivity. Я в некоторой степени могу заставить его работать, если я использую переменные stati c для доступа к TextViewActivity из настроек, так что я могу создать LoggingReceiver из настроек, но привязав его к TextViewActivity вместо настроек (this). Очевидно, что это неправильно (ТМ), поэтому я попробовал все варианты, которые мог найти в Google, но безрезультатно. Какой самый простой способ сделать это?

  • Я попытался ViewModel , и пример в документации вылетает на MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class); с error: no suitable constructor found for ViewModelProvider(MyActivity) (да, я проголосовал 1 звезду на этой странице документации). «Решение» из принятого ответа на вопрос об этом (т.е. с использованием new ViewModelProvider.NewInstanceFactory()) завершается с java.lang.RuntimeException: Cannot create an instance of class com.example.MyViewModel

  • Затем я попытался IntentService, как описано в https://developer.android.com/guide/components/services но мне неясны две вещи, так что, возможно, это не правильный подход к моей проблеме:

    1. Что мне делать в onHandleIntent? Мое намерение само по себе ничего не делает, оно должно быть лишь промежуточным звеном между тем, что приходит от MIDI к моему пользовательскому интерфейсу
    2. Как я могу получить доступ и использовать IntentService из обоих описанных выше видов деятельности? Конечно, шаблон синглтона, но как убедиться, что я не создаю те же проблемы, которые вызывает совместное использование статического c экземпляра Activity?

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Проблема в том, что я думал о «настольном» режиме разработки java (например, с помощью Swing), в котором windows являются постоянными объектами, в отличие от Android, где приходят Activity и вообще go время.

Мое решение состоит в том, чтобы сделать конструктор LoggingReceiver частным и сделать LoggingReceiver своей собственной фабрикой с одноэлементным шаблоном (т. е. с помощью метода getInstance(), возвращающего единственный существующий экземпляр static). ). Тогда и SettingsActivity, и TextViewActivity могут получить к нему доступ. Первый предназначен для привязки приемника к нужному источнику MIDI, второй - для регистрации в качестве ScopeLogger. Очевидно, мне также нужен setScopeLogger() (вызываемый TextViewActivity в его onCreate()) и некоторые проверки на ноль в LoggingReceiver.onSend(), если mLogger не установлен, поскольку исходный код предполагал, что это произойдет в конструкторе. Но эта часть "дела как обычно" в java.

0 голосов
/ 24 марта 2020

Если вы хотите передать некоторые базовые c данные из одного занятия в другое, вы должны использовать Intent

Как использовать это:

Деятельность 1 (отправка данных в операцию 2):

Intent intent = new Intent(context, TextViewActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Деятельность 2 (получение данных из операции 1):

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");
...