Добрый день. Возникла такая проблема. Есть приложение под андроид, которое содержит MainActivity, в котором при создании запускается сервер, которые слушает определенный порт, и выполняет некоторые действия, когда на порт приходят команды. Одна из команд - запустить проигрывание видео по ссылке. При ее получении сервер получает адрес стрима, и запускает новое Активити с видеоплеером. Затем, если во время проигрывания видео нажать кнопку назад, то видеоплеер пропадает, и активной становится стартовая страница (MainActivity), однако, если потом послать на сервер команду закрытия видеоплеера, то приложение падает. Собственно вопрос, как мне грамотно организовать сервер, которые по приходу новых команд открывает нужные активити? (не только видеоплеер, есть еще проигрывание аудио и отображение файлов - тоже отдельными активити), и решить вот эту проблему с кнопкой назад.
код сервера:
public class Server {
MainActivity activity;
ServerSocket serverSocket;
String message = "";
Socket socket;
static final int socketServerPORT = 8080;
private final String TAG = "SERVER_LOG";
public Server(MainActivity activity) throws IOException {
this.activity = activity;
Thread socketServerThread = new Thread(new SocketServerThread());
serverSocket = new ServerSocket(socketServerPORT);
socketServerThread.start();
}
public int getPort() {
return socketServerPORT;
}
public void onDestroy() {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private class SocketServerThread extends Thread {
@Override
public void run() {
try {
socket = serverSocket.accept();
while (true) {
InputStream is = socket.getInputStream();
byte buf[] = new byte[64*1024];
int r = is.read(buf);
final String data = new String(buf, 0, r);
if (data.equals("@@stop")) {
is.close();
Intent main_activity = new Intent(activity, MainActivity.class);
activity.finish();
main_activity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.startActivity(main_activity);
continue;
}
if (data.equals("@@stop_streaming")) {
Log.e(TAG, "stop command was detected");
continue;
}
if (data.equals("@@continue_stream")) {
Log.e(TAG, "continue command was detected");
continue;
}
if (Pattern.matches("http://[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}:[0-9]{1,5}/[a-z,A-Z,0-9]*", data)) {
final String reply = new String("Successfully connected!");
OutputStream outputStream = socket.getOutputStream();
if (r > 0)
outputStream.write(reply.getBytes());
outputStream.flush();
// PrintStream printStream = new PrintStream(outputStream);
// printStream.print("kek");
// printStream.close();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.msg.setText(data);
}
});
// SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
// socket, count);
// socketServerReplyThread.run();
final String url = new String(data);
Intent toFullscreen = new Intent (activity, VideoVLCActivity.class);
Bundle b = new Bundle();
b.putString("videoUrl", url);
toFullscreen.putExtras(b); //Put your id to your next Intent
activity.startActivity(toFullscreen);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private class SocketServerReplyThread extends Thread {
private Socket hostThreadSocket;
int cnt;
SocketServerReplyThread(Socket socket, int c) {
hostThreadSocket = socket;
cnt = c;
}
@Override
public void run() {
OutputStream outputStream;
String msgReply = "Hello from Server, you are #" + cnt;
try {
outputStream = hostThreadSocket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.print(msgReply);
printStream.close();
message += "replayed: " + msgReply + "\n";
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.msg.setText(message);
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
message += "Something wrong! " + e.toString() + "\n";
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.msg.setText(message);
}
});
}
}
public String getIpAddress() {
String ip = "";
try {
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (enumNetworkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface
.getInetAddresses();
while (enumInetAddress.hasMoreElements()) {
InetAddress inetAddress = enumInetAddress
.nextElement();
if (inetAddress.isSiteLocalAddress()) {
ip += inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ip += "Something Wrong! " + e.toString() + "\n";
}
return ip;
}
}
Ошибка возникает потому что вы сначала завершаете Activity activity.finish()
, а потом через 2 строчки пытаетесть стартануть другое активити из уже завершенного activity.startActivity()
. Попробуйте перенести finish
после startactivity
.
P.S. Хотя, по-моему, флаги, которые вы ставите в интент должны и так закрыть активити, и вызов finish()
не нужен.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Только начинаю разбиратьсяСкачал Tomcat, запустил его
С проблемой столкнулся неожиданно, так как раньше всегда конфигурировал проект тем же способом