Android: вызов метода из Сервиса в Активность - PullRequest
0 голосов
/ 02 декабря 2010

Мне нужно решить простой вопрос, но я не уверен, как это сделать.

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

Если входное сообщение «СТАРТ», я запускаю действие следующим образом:

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress());
getApplication().startActivity(dialogIntent);

Пока это действие выполняется,Сервис продолжает работать.В какой-то момент я могу зарезервировать «СТОП».Я хотел бы вызвать метод в ранее созданном Activity, но я не уверен, как с ним взаимодействовать.

Я не хочу использовать статический метод.Как я могу это сделать?

Большое спасибо,

РЕДАКТИРОВАТЬ: я изменил свой код на это:

Intent dialogIntent = new Intent("com.voip.rudy.START_CALL");
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress());
getApplication().startActivity(dialogIntent);

И в манифесте:

<activity android:name=".VoIPCall">
    <intent-filter>
        <action android:name="com.voip.rudy.START_CALL" />
        <action android:name="com.voip.rudy.STOP_CALL" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>


<category android:name="android.intent.category.DEFAULT" /> was required to avoid having it crash.

РЕДАКТИРОВАТЬ:

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

Переменные-члены не инициализируются, когда я вызываю одно действие за другим, создается впечатление, что создается новое действиекак-то.Будут ли в любом случае действовать те же действия и держать объекты в целости, пожалуйста?

Джеймс

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Добавьте Intent.FLAG_ACTIVITY_SINGLE_TOP |Intent.FLAG_ACTIVITY_REORDER_TO_FRONT помечает ваше намерение и вызывает startActivity новым действием или специальным дополнением, которое может идентифицировать намерение.

В упражнении напишите метод с именем:

private void handleIntent(Intent intent) {
}

, вызовите этоиз onCreate (или onResume) используя:

handleIntent(getIntent());

, а также напишите:

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}
0 голосов
/ 07 декабря 2010

Я думаю, что любой из методов будет работать. Я предполагаю, что поведение, которое вы видите, связано с жизненным циклом действий в android, и вам может потребоваться перенести часть обработки в методы onResume / onPause или onStart / onStop. Если вы обнаружите, что ваша активность в onCreate не вызывается, но теперь ваша активность активна, возможно, в системе все еще существует экземпляр активности из предыдущего вызова. Если это так, вполне возможно, что ОС использует это вместо новой активности, которую вы хотите. Лучший способ проверить, является ли это проблемой, - это поместить несколько вызовов «Log.d» в начало и конец всех методов действия, которые вы переопределяете. Вы сможете рассказать, что происходит, наблюдая за logcat. Техника, которую вы используете, также может зависеть от того, насколько синхронно вы хотите, чтобы реакция действия была связана с событием TCP. Если вы хотите полностью асинхронный режим, вы можете использовать стандартную трансляцию или сервисный обратный вызов с отправкой сообщения. Если вы хотите синхронно, сделайте это с помощью обратного вызова службы. Если вы еще этого не видели, эта ссылка на SDK содержит довольно хорошее описание жизненного цикла действия http://developer.android.com/reference/android/app/Activity.html

0 голосов
/ 02 декабря 2010

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

1) Создайте собственное намерение, и действие или служба реагируют на него, когда Otehr отправляет его. 2) Вместо службы настройте логику.ища tcp-соединение как асинхронную задачу в диалоговом действии, когда у вас есть tcp-соединение, вы можете передать его службе, чтобы она выполняла свою работу. 3) Взгляните на примеры локального сервиса и удаленного сервиса SDK и используйте обратный вызовкод в качестве основы для передачи данных обратно в деятельность.Вы также можете позвонить через интерфейс обратно в сервис.4) Может быть, даже настроить «архитектуру» вещательного приемника.Это имеет то преимущество, что полностью отделяет активность пользователя от сервиса.Вы можете поместить часть своей логики приложения в службу в другом процессе или даже в процесс, который выполняется при загрузке устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...