【问题标题】:startActivity on foreground application causes onPause/onResume前台应用程序上的 startActivity 导致 onPause/onResume
【发布时间】:2012-06-18 22:37:50
【问题描述】:

我有一个服务正在运行并在一个套接字上侦听。该服务将启动一个活动以显示视频帧,当它通过套接字接收到“格式”消息时,每个视频帧都会连续发送。

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”。

感谢任何 cmets 或建议。

-Z

【问题讨论】:

    标签: android service onresume onpause start-activity


    【解决方案1】:

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

    Tim 的想法似乎不错(实际上涉及覆盖 onNewIntent(...)),但即便如此,Activity 也会暂停/恢复。

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

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

    2. 定义一个ResultReceiver类,在你的Activity中创建它的一个实例,并通过你用来启动ServiceIntent发送它

    【讨论】:

    • 感谢您的建议。我一定会尝试这些,让你知道我发现了什么。
    • 我发现我的应用处于类似情况。我的问题是在onPause() 中我必须释放相机(参见10. <b>Important</b>:)。我使用的解决方法是在调用startActivity() 之前检查Activity 是否在前台。我只是在onResume() 中将静态布尔字段设置为true,在onPause() 中设置为false。我确信我的 Activity 只有一个实例可以活动(它具有 launchMode=singleTop 并且不能从我的应用程序外部启动),并且我使用消息将数据从服务传递到 Activity。
    【解决方案2】:

    【讨论】:

    • 感谢您的帮助。我尝试了 FLAG_ACTIVITY_SINGLE_TOP,但似乎没有帮助。我可以验证它是我开始的同一个活动,所以“单顶”正在做它应该做的事情,但是这个活动仍然通过了一个暂停,然后是一个恢复。
    猜你喜欢
    • 2015-04-11
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多