我有一项服务正在运行并在套接字上侦听。该服务将启动一个活动以显示视频帧,当它通过套接字接收到“格式”消息时,每个视频帧都会连续发送。
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() )导致 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