我有一個服務運行並偵聽套接字。當服務通過套接字接收到「格式」消息時,該服務將開始顯示視頻幀的活動,然後每個視頻幀連續發送。爲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
感謝您的建議。我一定會嘗試一下,讓你知道我找到了什麼。 – Zoccadoum
我在類似的情況下找到了我的應用。我的問題是,在'onPause()'我必須釋放相機(參見[10. 重要:](http://developer.android.com/reference/android/hardware/Camera.html))。我使用的解決方法是在調用'startActivity()'之前檢查Activity是否在前臺。我只需在'onResume()'中設置一個靜態布爾字段爲** true **,並在'onPause()'中設置爲** false **。我確信我的活動只有一個實例可以活着(它具有launchMode = singleTop,無法從我的應用程序之外啓動),並且我使用消息將數據從服務傳遞到活動。 –