Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
nexx124
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 7
1

Создание сервера, запускающего разные Activity

16.03.2017, 16:41. Просмотров 214. Ответов 5
Метки нет (Все метки)

Добрый день. Возникла такая проблема. Есть приложение под андроид, которое содержит MainActivity, в котором при создании запускается сервер, которые слушает определенный порт, и выполняет некоторые действия, когда на порт приходят команды. Одна из команд - запустить проигрывание видео по ссылке. При ее получении сервер получает адрес стрима, и запускает новое Активити с видеоплеером. Затем, если во время проигрывания видео нажать кнопку назад, то видеоплеер пропадает, и активной становится стартовая страница (MainActivity), однако, если потом послать на сервер команду закрытия видеоплеера, то приложение падает. Собственно вопрос, как мне грамотно организовать сервер, которые по приходу новых команд открывает нужные активити? (не только видеоплеер, есть еще проигрывание аудио и отображение файлов - тоже отдельными активити), и решить вот эту проблему с кнопкой назад.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2017, 16:41
Ответы с готовыми решениями:

Создание Activity в другом Activity
Нормально ли создавать экземпляр какого-либо Activity в текущем Activity? Дело...

Создание Activity
Добрый день! При создании нового проекта возникает проблема - Eclipse ту хочет...

Создание нового Activity
Прошел примерно день как скачал Android Studio, многому научился, и затупил как...

Создание фона для Activity
Хочу создать фон для активити.. в дальнейшем буду его сжимать до...

Создание и вызов второго Activity
Добрый день! Немного запутался с ООП в проекте суть в следующем: Имеем...

5
ExFau$t
568 / 512 / 115
Регистрация: 08.05.2012
Сообщений: 2,549
16.03.2017, 16:45 2
Java
1
2
3
if (player!=null){
     closePlayer();
}
0
Pablito
2732 / 2167 / 735
Регистрация: 12.05.2014
Сообщений: 7,586
Завершенные тесты: 1
16.03.2017, 16:47 3
я бы запуск/останов сервера вынес бы в сервис
и пусть этот сервис запускает какие надо активити
1
nexx124
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 7
16.03.2017, 16:49  [ТС] 4
UPD: прикрепил код сервера
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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;
    }
}
Добавлено через 1 минуту
Паблито, спасибо, а не могли бы минимальный пример привести как это сделать? а то программированием под android занялся я совсем недавно, и еще многие вещи не шарю к сожалению(
0
Pablito
16.03.2017, 16:49
  #5

Не по теме:

призываю в тему demixdn
тут кто-то передает контекст в левый класс и хранит там ссылку на него! :D

0
demixdn
310 / 255 / 79
Регистрация: 31.10.2016
Сообщений: 619
16.03.2017, 17:43 6
что? кто? зачем в сервисе ссылка на Activity?? убрать!! сервис имеет свой контекст, с него можно запускать intent. ну конечно с ограничениями, приходится ставить флаг FLAG_ACTIVITY_NEW_TASK.
Цитата Сообщение от nexx124 Посмотреть сообщение
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);
вы понимаете, что здесь происходит?
вы сначала завершаете activity (activity.finish(), а после пытаетесь на нем вызвать метод (activity.startActivity(main_activity)).

Если нужно MainActivity остановить, используйте BroadcastReceiver. В крайнем случае оборачивайте MainActivity в WeakReference. Да и вообще вы используете FLAG_ACTIVITY_NEW_TASK.

Добавлено через 9 минут
Хмм, у вас тут все хуже чем я увидел в первый момент.
1. SocketServerReplyThread должен быть статическим. Но лучше его вынести в отдельный класс, а в констуктор передавать какой-нибудь callback, чтоб не городить код, подобный этому: activity.runOnUiThread...
Тоже самое касается и SocketServerThread.
2. То что описал выше.

Добавлено через 22 минуты
Кликните здесь для просмотра всего текста

Вот как то так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public final class SocketServerThread extends Thread {
 
    private final ServerSocket serverSocket;
    @Nullable
    private final StreamListener listener;
 
    public SocketServerThread(@NonNull ServerSocket serverSocket, @Nullable StreamListener listener) {
        this.serverSocket = serverSocket;
        this.listener = listener;
    }
 
    @Override
    public void run() {
        try {
            Socket 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);
                is.close();
 
                if (data.equals("@@stop")) {
                    if (listener != null)
                        listener.onStop();
                    continue;
                }
                if (data.equals("@@stop_streaming")) {
                    if (listener != null)
                        listener.onStopStreaming();
                    continue;
                }
                if (data.equals("@@continue_stream")) {
                    if (listener != null)
                        listener.onContinueStreaming();
                    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();
                    String url = new String(data);
 
                    if (listener != null) {
                        listener.onPlay(url);
                    }
                }
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public interface StreamListener {
        void onStop();
 
        void onStopStreaming();
 
        void onContinueStreaming();
 
        void onPlay(@NonNull String videoUrl);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class ServerService extends Service implements SocketServerThread.StreamListener {
 
    private static final int SOCKET_SERVER_PORT = 8080;
    private final String TAG = "SERVER_LOG";
 
    private ServerSocket serverSocket;
    public ServerService() {
        try {
            serverSocket = new ServerSocket(SOCKET_SERVER_PORT);
            Thread socketServerThread = new Thread(new SocketServerThread(serverSocket, this));
            socketServerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
 
    @Override
    public void onDestroy() {
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        super.onDestroy();
    }
 
    @Override
    public void onStop() {
        Intent main_activity = new Intent(this, MainActivity.class);
        main_activity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(main_activity);
    }
 
    @Override
    public void onStopStreaming() {
        Log.e(TAG, "stop command was detected");
    }
 
    @Override
    public void onContinueStreaming() {
        Log.e(TAG, "continue  command was detected");
    }
 
    @Override
    public void onPlay(@NonNull String videoUrl) {
        Intent toFullscreen = new Intent (this, VideoVLCActivity.class);
        Bundle b = new Bundle();
        b.putString("videoUrl", videoUrl);
        toFullscreen.putExtras(b);
        startActivity(toFullscreen);
    }
}
0
16.03.2017, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2017, 17:43

Динамическое создание элементов на другом activity
В чем суть: Нажимаем кнопку в лэйауте1, после чего создается ImageButton на...

Создание суперкласса для всех Activity
Господа,доброго времени суток! Возник следующий вопрос: у меня есть несколько...

Создание окон в navigation drawer activity
Ребят, всем привет. Пытаюсь создать фрагменты в navigation drawer activity, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru