У меня есть служба, работающая и прослушивающая сокет. Эта служба запустит операцию для отображения видеофрагмента, когда получает сообщение «формат» через сокет, после чего каждый видеокадр отправляется последовательно.startActivity on foreground application вызывает onPause/onResume
Тело 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
Спасибо за ваши предложения. Я обязательно попробую их и дам вам знать, что я нахожу. – Zoccadoum
Я нашел свое приложение в подобной ситуации. Моя проблема заключалась в том, что в 'onPause()' я должен освободить камеру (см. [10. Важно:] (http://developer.android.com/reference/android/hardware/Camera.html)).Обходной путь, который я использую, - проверить, находится ли действие на переднем плане, прежде чем я вызову 'startActivity()'. Я просто устанавливаю статическое логическое поле в ** true ** в 'onResume()' и ** false ** в 'onPause()'. Я уверен, что может быть только один экземпляр моей активности (он имеет launchMode = singleTop и не может быть запущен извне моего приложения), и я использую сообщение для передачи данных из службы в действие. –