2012-06-18 35 views
3

我有一個服務運行並偵聽套接字。當服務通過套接字接收到「格式」消息時,該服務將開始顯示視頻幀的活動,然後每個視頻幀連續發送。爲MyService的前臺應用程序的startActivity導致onPause/onResume

身體:(簡體和錯誤處理的簡潔,刪除):

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())導致Activity接收到「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. Activity使用內部BroadcastReceiver接收Intent並將數據傳遞到Activity。但是,我不知道內部BroadcastReceiver是否會導致其Activity以相同的方式暫停/恢復 - 可能不是,值得一試。

  2. 定義ResultReceiver類,在你Activity創建它的一個實例,並通過向它發送Intent您使用啓動Service

+0

感謝您的建議。我一定會嘗試一下,讓你知道我找到了什麼。 – Zoccadoum

+0

我在類似的情況下找到了我的應用。我的問題是,在'onPause()'我必須釋放相機(參見[10. 重要:](http://developer.android.com/reference/android/hardware/Camera.html))。我使用的解決方法是在調用'startActivity()'之前檢查Activity是否在前臺。我只需在'onResume()'中設置一個靜態布爾字段爲** true **,並在'onPause()'中設置爲** false **。我確信我的活動只有一個實例可以活着(它具有launchMode = singleTop,無法從我的應用程序之外啓動),並且我使用消息將數據從服務傳遞到活動。 –

0

我認爲你正在尋找Intent.FLAG_ACTIVITY_SINGLE_TOP

+0

感謝您的幫助。我嘗試了FLAG_ACTIVITY_SINGLE_TOP,但似乎沒有幫助。我可以驗證它與我開始的活動相同,因此「單個頂級」正在做它應該做的事情,但活動仍然會暫停,然後是簡歷。 – Zoccadoum

相關問題