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

标签 android service onresume onpause start-activity

我有一个服务正在运行并在套接字上监听。当此服务通过套接字接收到“格式”消息时,将启动一个 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 );
            }
        }
}

所有这些都非常有效,当我收到第一个格式消息并绘制视频帧时,我的 Activity 就会显示出来。但是,发送视频帧数据的服务器会定期发送“格式消息”,以补偿显示、方向等方面的变化。如果我的 Activity 已经在前台,则格式消息调用 bring_activity_foreward(调用 startActivity() )导致 Activity 收到一个“onPause”,紧接着是一个“onResume”。由于我的 Activity 在恢复时绑定(bind)到服务,并在暂停时解除绑定(bind),所以我的 Activity 不断地解除绑定(bind)并重新绑定(bind)到服务。这似乎不是很有效。

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();
    }

    ...

}

有没有办法将 Intent 发送到我的 Activity ,这样如果它已经在前台,它就不会执行“暂停 -> 恢复”?请记住,由于我的 startActivity 是从服务调用的,因此它必须包含“FLAG_ACTIVITY_NEW_TASK”。

感谢任何意见或建议。

-Z

最佳答案

Activity 总是在收到 Intent 之前暂停,因此您在 onResume()/onPause 中绑定(bind)/解除绑定(bind)的方法() 总是会产生这种行为。

Tim 的想法似乎是个好主意(实际上涉及覆盖 onNewIntent(...)),但即便如此,Activity 仍将暂停/恢复。

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

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

  2. 定义一个 ResultReceiver类,在您的 Activity 中创建它的实例,并通过用于启动 Service

    Intent 发送它

关于android - 前台应用程序上的 startActivity 导致 onPause/onResume,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092101/

相关文章:

c# - Visual Studio 2015 - Xamarin - Android - 当我尝试在 .cs 文件中执行任何操作时获取 "resource.id does not contain a definition for xxx"

android - 非游戏程序员的手机游戏框架

android - 如何每 4 小时显示一次通知?

java - Guava的AbstractExecutionThreadService可以复用吗?

android - 应用程序无响应 (ANR) 正在执行服务 android

Android生命周期——为什么不能在onPause(){ }中调用onResume()?

Android 库项目和单元测试

android sqlite onresume() oncreate()

android - 停止在恢复后重新创建 fragment ?

android - 使用支持lib依赖性v7:26.1.0时发生Gradle dex问题