2012-06-18 2 views
3

У меня есть служба, работающая и прослушивающая сокет. Эта служба запустит операцию для отображения видеофрагмента, когда получает сообщение «формат» через сокет, после чего каждый видеокадр отправляется последовательно.startActivity on foreground application вызывает onPause/onResume

Тело MyService: (упрощенный и обработки ошибок удалена для краткости):

public class MyService extends Service 
    { 
     .... 

     while (_run) 
     { 
      Socket s = serverSocket.accept(); 
      Thread connection_handler = new thread(new handleSocketConnection(s); 
     } 

     public class handleSocketConnection implements Runnable 
     { 
      boolean _run; 
      Socket s; 
      handleSocketConnection(Socket socket) 
      { 
       _run = true; 
       s = socket; 
      } 

      public void run() 
      { 
       InputStream in = s.getInputStream(); 
       byte bytes[] = new byte[100]; 

       while(_run) 
       { 
        in.read(inbytes, 0, 100); 
        if (bytes[0] == 10) // if the first byte is a 10 this is a format message 
        { 
         bring_activity_foreward(); 
        } 
        else // otherwise this is video frame data 
        { 
         send_activity_bytes(bytes, 100); 
        } 
       } 

      } 

      public void bring_activity_foreward() 
      { 
       Intent show_intent = new Intent(this.MyActivity.class); 
       show_intent.setFlags(Intent.FLAG_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(show_intent); 
      } 
     } 
} 

Все это прекрасно работает причина моей деятельности, чтобы показать, когда я получаю первое сообщение формата и сделать кадр видео (ы). Однако сервер, отправляющий данные видеофрагмента, будет отправлять «сообщение формата» через равные промежутки времени, чтобы компенсировать изменения в отображении, ориентации и т. Д. Если моя активность уже находится на переднем плане, сообщение формата вызывает вызовы bring_activity_foreward (который вызывает startActivity()), в результате чего активность получает «onPause», а затем «onResume». Поскольку моя активность связывается с сервисом, когда он возобновляется, и отключает его при паузе, моя деятельность постоянно развязывается и повторно привязывается к сервису. Это не кажется очень эффективным.

public class ShowFrameActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.viewframe); 
    } 

    @Override onResume() 
    { 
     super.onResume(); 
     bindToService(); 
    } 

    @Override onPause() 
    { 
     unbindFromService(); 
    } 

    ... 

} 

Есть ли способ, чтобы отправить намерение моей деятельности, поэтому он не будет делать «паузу -> резюме», если он уже на переднем плане? Имейте в виду, что, поскольку моя функция startActivity вызывается из службы, она должна включать «FLAG_ACTIVITY_NEW_TASK».

Благодарим за любые замечания или предложения.

-Z

ответ

2

Activity всегда приостановлена, прежде чем она получает Intent так ваш подход связывания/Освобождению в onResume()/onPause() всегда будет производить такое поведение.

Идея от Тима кажется хорошей (и на самом деле включает в себя переопределение onNewIntent(...)), но даже тогда Activity будет приостановлен/возобновлен.

Лично я хотел бы попробовать один из двух вариантов ...

  1. Используйте внутреннюю BroadcastReceiver в Activity получить Intent и передать данные в Activity. Говоря это, однако, я не уверен, что внутренний BroadcastReceiver приведет к тому, что Activity будет приостановлено/возобновлено таким же образом - вероятно, нет, и это стоит попробовать.

  2. Определить ResultReceiver класс, создать экземпляр этого в вашем Activity и отправить его через Intent вы используете для запуска Service

+0

Спасибо за ваши предложения. Я обязательно попробую их и дам вам знать, что я нахожу. – Zoccadoum

+0

Я нашел свое приложение в подобной ситуации. Моя проблема заключалась в том, что в 'onPause()' я должен освободить камеру (см. [10. Важно:] (http://developer.android.com/reference/android/hardware/Camera.html)).Обходной путь, который я использую, - проверить, находится ли действие на переднем плане, прежде чем я вызову 'startActivity()'. Я просто устанавливаю статическое логическое поле в ** true ** в 'onResume()' и ** false ** в 'onPause()'. Я уверен, что может быть только один экземпляр моей активности (он имеет launchMode = singleTop и не может быть запущен извне моего приложения), и я использую сообщение для передачи данных из службы в действие. –

0

Я думаю, что вы ищете Intent.FLAG_ACTIVITY_SINGLE_TOP

+0

Спасибо за вашу помощь. Я попробовал FLAG_ACTIVITY_SINGLE_TOP и, похоже, не помог. Я могу проверить, что это та же самая деятельность, которую я начал, поэтому «одиночная вершина» делает то, что ей нужно, однако активность все еще проходит паузу, а затем возобновляется. – Zoccadoum

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