2014-02-13 3 views
2

У меня есть andoid-приложение, которое подключается к серверу WebSocket при входе пользователя в систему. Если пользователь простаивает какое-то время или по какой-либо причине его сеанс заканчивается/заканчивается, приложение получает уведомление через соединение WebSocket, и я хочу вернуть его к активности входа (в приложении нет функциональности, если он не вошел в систему).Начало деятельности из фоновой темы

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

Я осознал свою плохую практику, чтобы нарушить поток пользователя внезапно, но ни одна из функций не будет работать, если у пользователя нет действительного сеанса.

Я использую android-websocket (https://github.com/koush/android-websockets) библиотеку в качестве клиента, если это имеет значение.

Заранее спасибо Tomas

EDIT: Иногда я также хотел бы, чтобы сообщить пользователю в виде Toast или диалога, что определенное событие произошло на сервере.

+0

возможно дубликат [Android Начало деятельности от службы] (http://stackoverflow.com/questions/3606596/android-start-activity-from-service) – silwar

ответ

1

Я думаю, что любой из этих двух подходов должно работать:

  • Использовать Handler: Установите Handler в вашем Activity, переопределить его handleMessage поэтому, когда вы отправляете сообщение, вы просто приносите свой Activity на передний план (или запустите его). Для того, чтобы привести его на передний план:

    Intent i = new Intent(this, MyMainActivity.class); 
    i.setAction(Intent.ACTION_MAIN); 
    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    startActivity(i); 
    
  • Используйте BroadcastReceiver: Там нет причин, почему это не должно работать, просто объявить приемник, зарегистрировать его для какого-либо действия (может быть настроен) и начать свою деятельность таким же образом, чем выше. Не забудьте отменить регистрацию после завершения или закрыть приложение.

Если вам нужен пример на любом, просто спросите об этом.

+0

Первый подход будет означать, что я должен установить обработчик в каждой отдельной Деятельности в моем приложении сейчас? То, чего я пытаюсь избежать. Но я попробую второй подход с BroadcastReceiver и отчитаюсь, если я его заработаю. Спасибо! – taracus

+0

Действительно, это означало бы, что это должно быть «активность». В этом случае попробуйте второй, если вам нужна помощь, просто спросите, скажите. – nKn

2

Чтобы начать деятельность от фона попробуйте следующий код

Intent newIntent= new Intent(getBaseContext(), MainActivity.class); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    getApplication().startActivity(newIntent); 
+0

Проблема У меня нет доступа к getBaseContext() из моего класса Websocket-client? – taracus

+0

Вы имеете в виду WebSocketClient.java? – silwar

2

я ИСПЫТАНИЯ

  • вы можете startActivity из не Ui тему
  • вы можете закончить активность из не Ui Темы

Посмотрите на проекте АКРА - хорошая обработка исключений. В ReportExecutor в строке 217 (https://github.com/ACRA/acra/blob/master/acra/src/main/java/org/acra/builder/ReportExecutor.java#L217) активность запускается в совершенно новом потоке (без runOnUiThread).

Я был слишком удивлен, почему это работает :)

Смежные вопросы