Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
nexx124
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 7
#1

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

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

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

Создание Activity в другом Activity - Программирование Android
Нормально ли создавать экземпляр какого-либо Activity в текущем Activity? Дело в том, что код, нужный для работы с данными находится в...

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

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

Создание фона для Activity - Программирование Android
Хочу создать фон для активити.. в дальнейшем буду его сжимать до xxxhdpi/xxhdpi/xhdpi/hdpi/mdpi/ldpi. Какое разрешение изображения мне...

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

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

5
ExFau$t
506 / 461 / 98
Регистрация: 08.05.2012
Сообщений: 2,308
16.03.2017, 16:45 #2
Java
1
2
3
if (player!=null){
     closePlayer();
}
0
Pablito
2631 / 2113 / 656
Регистрация: 12.05.2014
Сообщений: 7,398
Завершенные тесты: 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
тут кто-то передает контекст в левый класс и хранит там ссылку на него!

0
demixdn
283 / 230 / 66
Регистрация: 31.10.2016
Сообщений: 545
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 - Программирование Android
Господа,доброго времени суток! Возник следующий вопрос: у меня есть несколько активностей(activity1, activity2, activity3), каждая из них...

Создание выборочного activity при старте application - Программирование Android
Доброго времени суток! В приложении возможна регистрация. Когда юзер не зарегистрирован, то его при старте app перенаправляет на...

Приложение зависает, если свернуть и развернуть Activity или перейти на другую Activity - Программирование Android
У меня в параллельном потоке происходит куча apply() Решение использовать apply вместо commit было принято из-за скорости. Но...

Изменение layout-элементов одного activity из другого activity - Программирование Android
Здравствуйте! Я хочу изменить размер или цвет текста TextView в одном activity из второго activity, каким образом мне можно это...


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

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

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