3

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

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

4

2 に答える 2

2

AnActivityは、受信する前に常に一時停止されるため、 /Intentでのバインド/バインド解除のアプローチにより、常にこの動作が生成されます。onResume()onPause()

ティムのアイデアは良いもののように見えますが(実際にはオーバーライドが含まれますonNewIntent(...))、それでもActivity一時停止/再開されます。

個人的には、2つのオプションのいずれかを試してみます...

  1. の内部BroadcastReceiverを使用して、Activityを受信しIntent、データをに渡しますActivity。ただし、インナーBroadcastReceiverActivity同じように一時停止/再開するかどうかはわかりません。おそらくそうではなく、試す価値があります。

  2. ResultReceiverクラスを定義し、のインスタンスを作成して、を開始するために使用するをActivity介して送信します。IntentService

于 2012-06-18T23:01:30.860 に答える
0

あなたはIntent.FLAG_ACTIVITY_SINGLE_TOPを探していると思います

于 2012-06-18T22:42:13.590 に答える