ソケットで実行およびリッスンしているサービスがあります。このサービスは、ソケットを介して「フォーマット」メッセージを受信すると、ビデオフレームを表示するアクティビティを開始し、各ビデオフレームが連続して送信されます。
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