前台应用程序的startActivity导致onPause / onResume

时间:2012-06-18 22:37:51

标签: android service onresume onpause start-activity

我有一个服务在套接字上运行和监听。该服务将在其通过套接字接收“格式”消息时开始显示视频帧的活动,然后每个视频帧连续发送。

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

2 个答案:

答案 0 :(得分:2)

Activity在收到Intent之前始终会暂停,因此您在onResume() / onPause()中绑定/取消绑定的方法始终会产生此行为。

Tim的想法似乎很好(实际上涉及覆盖onNewIntent(...)),但即使这样,Activity也会被暂停/恢复。

就个人而言,我会尝试两种选择之一...

  1. 使用BroadcastReceiver中的内部Activity来接收Intent并将数据传递给Activity。但是,我不确定内部BroadcastReceiver是否会导致它Activity以同样的方式暂停/恢复 - 可能不会,并且值得尝试。

  2. 定义ResultReceiver课程,在Activity中创建一个实例,并通过您用Intent启动Service

答案 1 :(得分:0)

我认为您正在寻找Intent.FLAG_ACTIVITY_SINGLE_TOP