Форум программистов, компьютерный форум CyberForum.ru

Приём сообщений от сервера в фоне - Android

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
09.09.2016, 07:06     Приём сообщений от сервера в фоне #1
Привет, нужна помощь в структуре.
Первый раз работаю с подключением.
В общем к делу:
1.Отправляю запрос на сервер
2.У меня есть tabhost, инициализирую его с двумя классами, диалоги, и звонки.
3. Сейчас после запроса мне приходит ответ в виде Json строки, распарспарсиваю и заполняю как на скрине.

Вопрос собственно такой, мне нужно динамически отслеживать приходящую строку, так как после авторизации сервер будет мне отсылать сообщения с данными.

Как только прийдет сообщение мне нужно сразу обновить.

Я использую обычный Thread , AsyncTask не подходит так как он же выполняется один раз.

А мне нужно слушать на протяжение всей жизни приложения. Все бы нечего, но на слабых одноядерных с оперативой 512 жутко тормозит.

Обращаюсь сюда потому что нужен совет людей по опытней.

Так же я понял что нужно скорее всего использовать подключение в Service, и выводить уведомления с помощью Reciver. Но не знаю как применить это к моему коду.

Буду очень благодарен за помощь.
Миниатюры
Приём сообщений от сервера в фоне  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
14.09.2016, 10:18     Приём сообщений от сервера в фоне #21
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
поэтому и нужно постоянно слушать
Еще раз. В вашем случае "слушать" это периодически запрашивать сервер.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
14.09.2016, 11:35  [ТС]     Приём сообщений от сервера в фоне #22
REALIST07, Посмотрел ваше решение скорее всего точно мне и нужно но я пока не понял как мне со своим кодом связать. Точнее я не понял как связать подключение с сервесом.
1. где моё подключение создавать? в App или сервесе?
2. как запросы отправлять?
Я конечно сам попробую сейчас потыкаться. но без помощи точно не разберусь)

Добавлено через 34 минуты
Alexvp, ок!
vxg
Модератор
 Аватар для vxg
2726 / 1737 / 173
Регистрация: 13.01.2012
Сообщений: 6,504
14.09.2016, 12:35     Приём сообщений от сервера в фоне #23
Alexvp, если отзывчивость должна быть высокой то слушать тоже можно
REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
14.09.2016, 18:57     Приём сообщений от сервера в фоне #24
TonyBicbaev, распиши подробно, что нужно по пунктам, подумаем
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
14.09.2016, 19:15     Приём сообщений от сервера в фоне #25
Цитата Сообщение от vxg Посмотреть сообщение
если отзывчивость должна быть высокой то слушать тоже можно
Это нарушение концепции "клиент-сервер", что неизбежно приведет к потери части информации. Например, пользователь свертывает приложение и его подчищает чистильщик. Или еще что-то подобное. При этом пользователь не получит порцию сообщений, которые транслировал сервер в это время. Возникает проблема восстановления этих сообщений.
Подобная схема есть, это т.н. потоковые трансляции (например, тв в интернете). Вы начинаете смотреть с момента подключения, а что было ранее для вас потеряно.
Да и постоянное "слушание" явно будет приводить к перегрузке смарта и быстрому разряду батарейки. Не думаю, что пользователи будут в восторге.
Проще и лучше получать последние, скажем 10-20 сообщений, по запросу от приложения, например, при старте приложения. Если нужны более ранние сообщения, то при прокрутке списка они будут подгружаться с сервера.
xaat
14.09.2016, 19:30
  #26

Не по теме:

Не хочу быть навязчивым... но все таки... бросайте велосипедостроение, пожалейте батарею ) используйте GCM
Вот небольшой перечень кто его использует:

Social Networking:

1. Google Plus

2. Twitter

3. Pinterest

4. Facebook

5. LinkedIn

6. Instagram


Forum Discussions

1. Topify

2. Tapatalk



Text Messaging (plus voice):

1. Facebook Messenger

2. Viber

3. Text Free: Calling Texting App

4. Meow

5. LINE

6. WhatsApp Messenger

7. Skype

REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
14.09.2016, 23:48     Приём сообщений от сервера в фоне #27
xaat,
1) чтобы использовать технологию gsm нужен сервер ( свой собственный), который будет регистрировать устройства в системе и выдавать каждому устройству ключи, у меня где-то был набор php - скриптов с этой темой,но там все вручную вбивается
2) Посмотри внимательно gcm sdk для android, когда я его видел в последний раз там было несколько сервисов, а не один, как в моем случае
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
15.09.2016, 05:57  [ТС]     Приём сообщений от сервера в фоне #28
REALIST07,
1. Есть кнопка вход, при нажатие на неё я отправлял запрос на авторизацию
Java
1
((Socket) this.getApplication()).connectWebSocket("1.1.3#Логин;Пароль|"); // такой формат запроса где 1.1.3# это команда, Логин Пароль это параметры
2. Когда я нажимаю мы обращаемся в этот класс
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
  public void connectWebSocket(final String s) { /*метод подключения*/
 
        URI uri;
        try {
            uri = new URI(SERVER );   //сервер
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return;
        }
        mWebSocketClient = new WebSocketClient(uri,new Draft_17()) {
            @Override
            public void onOpen(ServerHandshake serverHandshake) {
                Log.i("Websocket", "Opened");
                mWebSocketClient.send(s); //отпровляем команнду
 
                Log.i("e", "e" + s);
 
            }
 
            @Override
            public void onMessage(String s) { //получаем сообщение с сервера
                final String message = s;
               Log.e("m","m ="+message);
                treatmentMesage(message); //метод обработки сообщения
 
            }
 
            @Override
            public void onClose(int i, String s, boolean b) { 
                Log.i("Websocket", "Closed " + s);
           
 
            }
 
            @Override
            public void onError(Exception e) { //ошибка соединения
                Log.i("Websocket", "Error " + e.getMessage());
 
        
            }
        };
 
               mWebSocketClient.connect(); //создать подключение
 
 
    }
3. В логах я вижу как начинает приходить сообщение с сервера и обрабатываю его в методе
Java
1
2
3
4
5
6
7
   @Override
            public void onMessage(String s) { //получаем сообщение с сервера
                final String message = s;
               Log.e("m","m ="+message);
                treatmentMesage(message); //метод обработки сообщения
 
            }
4.строка в виде:
JSON
1
09-15 09:09:30.033 3451-3517/com.chat.chat_v100 E/m: m ={"type":"Connection","body":{"Type":"on","GroupID":null,"userT":"user","Id":41726,"chat":{"Id":41726,"Fio":"Усольцева Вера Витальевна (v_surkov@meshalkin.ru)","Email":"Гостиница ФГБУ ННИИПК Е.Н. Мешалкина","Phone":"","Readlytime":null,"LastMessage":null,"Site":null,"Status":null,"IP":"::1","Region":"::1","HomeTown":"::1","new_count_mes":null,"status_of_chat":null}}}
5. обрабатываю строку в зависимости от пришедшего типа.
запихиваю нужную информацию в ArrayList
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
 public void treatmentMesage(String s) {
 
        try {
 
            dataJsonObj = new JSONObject(s);
            String chats = dataJsonObj.getString("type");
            JSONObject bodyDataJsonObj = null;
            JSONObject newChatJsonObj = null;
            JSONObject connectDataJsonObj = null;
            switch (chats) {  //входящие сообщения
                case "Connection": //подключения
                    String bodyConnect = dataJsonObj.getString("body");
                    connectDataJsonObj = new JSONObject(bodyConnect);
                    String type = connectDataJsonObj.getString("Type");
                    String groupid = connectDataJsonObj.getString("GroupID");
                    String userT = connectDataJsonObj.getString("userT");
                    String Id = connectDataJsonObj.getString("Id");
                    String chat = connectDataJsonObj.getString("chat");
                    if(type.equals("fail"))
                    {
                        setQ(11);
                    }
 
                    break;
                case "Chats":  //чат
                  //  setQ(2);
                    jpm = new JsonParseMessage();
                    jpm.messageExpanded(s);
                    getArray();
 
 
                    break;
                case "Chanels": //каналы
 
                    jpm = new JsonParseMessage();
                    jpm.messageExpanded(s);
                    Log.e("12", "12");
 
                    // Log.e("m","m ="+s);
                    getChannels();
 
                    break;
                case "Message": //сообщения
                ......
6. И уже в другом классе в потоке отслеживаю по вот этому идентификатору setQ(2);
Java
1
2
3
4
5
6
7
8
9
10
11
12
   if(((Socket)this.getApplication()).getQ() == 2)
            {
 
                int counter = 0;
                for(int i = 0; i<  ((Socket)this.getApplication()).getId_dialog().size() ; i++) {
          
                    Dialog d = new Dialog(((Socket)this.getApplication()).getId_dialog().get(i),((Socket)this.getApplication()).getMail().get(i),
                            ((Socket)this.getApplication()).getName().get(i),((Socket)this.getApplication()).getReadlyTime().get(i),((Socket)this.getApplication()).getLastMessage().get(i),
                            ((Socket)this.getApplication()).getChat_channel_id2().get(i),((Socket)this.getApplication()).getChat_channel_id3().get(i));
                    dialogArray.add(i,d);
                
                }
7. Со всеми остальными запросами аналогично.
Как то так

Про соединение правильно было подмечено, но я с сервером нечего не могу сделать у меня задача ток клиент написать.

Добавлено через 35 минут
REALIST07, ну потом еще и уведомление вывести, если сообщение пришло (Message)
vxg
Модератор
 Аватар для vxg
2726 / 1737 / 173
Регистрация: 13.01.2012
Сообщений: 6,504
15.09.2016, 06:48     Приём сообщений от сервера в фоне #29
Цитата Сообщение от Alexvp Посмотреть сообщение
Это нарушение концепции "клиент-сервер"
вы пробовали реализовать мессенджер работающий в "реальном" режиме времени, например, как скайп на принципе "клиент запрашивает у сервера новые сообщения"? как вы думаете с какой частотой нужно молотить эти запросы что бы человек общался, а не глазел в экран как в почтовый ящик? как вы думаете что при этом будет с батареей? проблема потери связи при прослушивании никакая не проблема вообще - после потери связи клиент восстанавливает ее посылая на сервер ID последнего полученного сообщения и сервер шлет ему все начиная с ID следующего после указанного, а после пересылки переходит в режим "послал если есть новое"

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от xaat Посмотреть сообщение
Вот небольшой перечень кто его использует
на IOS особенно доставляет работа Skype - сообщения туда приходят только если вы откроете переписку. и то не факт что придут) видимо что-то очень модное там накрутили

TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
15.09.2016, 09:02  [ТС]     Приём сообщений от сервера в фоне #30
REALIST07,
То есть получается так :
1. Нужно подключение которое будет существовать на протяжение всей работы приложения.
2. Отправлять запросы.
3. Получать данные, и динамически их обновлять.
4. Уведомления для сообщение , при переходе которого откроется нужная активность(чат).
REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
15.09.2016, 15:06     Приём сообщений от сервера в фоне #31
TonyBicbaev, у меня все это сделано уже год как и все работает, я опишу процесс работы:
1) При первом запуске появляется окно регистрации, лично мне нужно только nickname, который человек введет вручную и его номер телефона зарегистрированный(использую Fabric), пара login/password генерируется так:
Java
1
2
3
4
public static String generateUUID() {
        UUID uuid = UUID.randomUUID();
        return uuid.toString().replace("-", "");
    }
2) Стартуется сервис,а временную пару login/password можно передавать либо в класс App либо в Intente в сервис сразу, пошел коннект;
3) Если ответа нет,то пытается зарегистрироваться;
4) после регистрации пара login/password записывается в файл, откуда и будет браться в дальнейшем и окно регистрации не будет показываться при наличие файла с учеткой;
5) Дальше опять запрос на соединение, если все ок,то стартуем сервис и ставим прослушки и т.д., если нет выводим окно с ошибкой для обращения в техподдрежку
6) Когда ты стартанул сервис,он будет работать до тех пор, пока его не прибьют, это может сделать вручную пользователь, либо система при нехватке памяти,например,но если ты не хочешь, чтобы связь потерялась,то ты должен продумать логику переподключения,для этого делаешь в сервисе так:
Java
1
2
3
4
5
6
@Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        
        // restart connection logic
    }
7) Если у тебя сервер свой,то тебе нужно слушателей создать самостоятельно, как это сделать? лично я бы сделал Handler, который вызывает себя с какой-то периодичностью( например, 15 сек) и этот handler проверяет соединение с сервером (аля ping)
8) Также можно повесить onBootReceiver,но с ним нужно быть осторожным, лучше не давать ему запускать activity,это приведет к сносу приложения пользователем, лучше пусть сервис стартует (он должен быть отключаемым в настройках и обязательно должна быть кнопка выйти, которая останавливает сервис!)

Добавлено через 11 минут
По поводу уведомлений:
В моей моедли работа с уведомлениями очень проста, если у тебя есть id сообщений уникальный, вот сам класс для работы с уведомлениями:
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
public class NotificationUtils {
    private static NotificationUtils instance;
 
    public static synchronized NotificationUtils getInstance(Context context)
    {
        if (instance == null)
            instance = new NotificationUtils(context);
        return instance;
    }
 
 
    private NotificationManager manager;
    private Context context;
    private NotificationUtils(Context context) {
        manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        this.context = context;
    }
 
 
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void sendNotification(ChatMessage message) {
 
        //boolean success = false;
        try
        {
            Thread.sleep(1000);
            int notifyId = (int) message.getId();
            Intent intent = new Intent(context, ChatActivity.class);
            intent.putExtra(Utils.ACTIVITY_PARAM_ID, message.getId());
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* Request code */, intent,
                    PendingIntent.FLAG_ONE_SHOT);
 
            Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Notification.Builder notificationBuilder = new Notification.Builder(context)
                    .setSmallIcon(R.drawable.notification)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.notification))
                    .setAutoCancel(true)
                    .setTicker(Utils.deleteCommandTags(message.getMessage()))
                    .setContentText(Utils.deleteCommandTags(message.getMessage()))
                    .setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT))
                    .setWhen(System.currentTimeMillis())
                    .setContentTitle(Utils.getRoomName(message.getId()))
                    .setDefaults(Notification.DEFAULT_ALL);
            manager.notify(notifyId, notificationBuilder.build());
           /* if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN &&
                message.getContentPath() != null) {
                Bitmap bmp = ((App)context).getNotifIcon(message.getContentPath());
                Notification notification =
                        new Notification.BigPictureStyle(notificationBuilder)
                        .bigPicture(bmp).build();
                manager.notify(notifyId,notification);
                success = true;
            }*/
 
        } catch (InterruptedException e) {
            e.printStackTrace();
        } /*catch (ExecutionException e) {
            e.printStackTrace();
        }
        finally {
            if (!success)
            manager.notify(notifyId, notificationBuilder.build());
        }*/
    }
 
    public void deleteNotification(Context context,int notifyId) {
      manager.cancel(notifyId);
    }
 
}
В классе App 2 метода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static NotificationUtils notificationUtils;
 @Override
    public void onCreate() {
        super.onCreate();
notificationUtils = NotificationUtils.getInstance(this);
   ...
}
 
public static void sendNotification(ChatMessage message) {
notificationUtils.sendNotification(chatMessage);
}
 
 public static void deleteNotification(long id) {
        notificationUtils.deleteNotification(getAppContext(), (int) id);
    }
Прикол такого подхода в том, что у тебя будет везде доступ к 1 единственному экземпляру БД,уведомлений и прочего в классе App и тебе не нужно думать и гадать об утечке памяти и куче ненужных экземпляров твоих классов, все в одном месте в одно время!

Добавлено через 8 минут
В 6 пункте забыл сказать, что сервис перезапустить нужно
Java
1
2
3
4
5
6
@Override
* * public void onTaskRemoved(Intent rootIntent) {
* * * * super.onTaskRemoved(rootIntent);
 
     // restart service !!!
* * }
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
15.09.2016, 15:48     Приём сообщений от сервера в фоне #32
vxg, Я свою точку зрения никому не навязываю
Каждый выбирает сам как ему делать.
Хоть скайп не мессенджер, я их не писал. Но делал достаточно много приложений, работающих по принципу "клиент-сервер". И во всех исходил из принципа - сервер пассивный участник, он должен отвечать на запросы.
В великолепном пояснении REALIST07 приведена реальная цифра - запросы каждые 15 секунд. Проверка соединения с сервером вполне может быть запросом на сервер.
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
15.09.2016, 16:28     Приём сообщений от сервера в фоне #33
Цитата Сообщение от REALIST07 Посмотреть сообщение
xaat,
1) чтобы использовать технологию gsm нужен сервер ( свой собственный), который будет регистрировать устройства в системе и выдавать каждому устройству ключи, у меня где-то был набор php - скриптов с этой темой,но там все вручную вбивается
2) Посмотри внимательно gcm sdk для android, когда я его видел в последний раз там было несколько сервисов, а не один, как в моем случае
Ну понятно что сервер нужен, что б php скрипты работали, откуда то нужно сообщения слать. Я сделал пяток приложений с использованием GCM. Для отправки сообщений с сервера через http нужен простенький php скрипт. А вот для приема сообщений upstream т.е. шлем с девайса на сервер сложнее, это делается через XMPP, и реализация сервера уже не так просто.
Кстати GCM позволяет групповые рассылки слать.
1. Про регистрацию, в простом случае при получении токена GCM мобильное приложение отправляет его простым POST запросом, вместе с логином паролем+ что то там еще, в моем случае это код SMS, привязываете токен к пользователю, сохраняете в базе и спокойно шлете сообщения. В более сложном я регистрировал клиента через сообщение GCM от девайса на сервер, дальше аналогично.
2. Не понял вопроса/замечания вроде там ничего нет больше, это функционал Play Service
REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
15.09.2016, 17:33     Приём сообщений от сервера в фоне #34
xaat, а можно просто поставить готовый типа Openfire и не парить себе мозг gcm
1) это понятно, это усложнаяет логику, все равно пилить сервер придется или брать готовый
2) а ты поставь их приложение и посмотри сколько ресурсов оно потребляет на пару с Play services, который некоторым вообще не нужен ( на кастомных прошивках многих отсутствуют они)
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
15.09.2016, 18:41     Приём сообщений от сервера в фоне #35
Цитата Сообщение от REALIST07 Посмотреть сообщение
xaat, а можно просто поставить готовый типа Openfire и не парить себе мозг gcm
1) это понятно, это усложнаяет логику, все равно пилить сервер придется или брать готовый
Для отправки сообщений достаточно 10 строчек php, без всякого сервера, для приема на девайсе немногим больше.
2) а ты поставь их приложение и посмотри сколько ресурсов оно потребляет на пару с Play services, который некоторым вообще не нужен ( на кастомных прошивках многих отсутствуют они)
Без Play Services давно уже не встречал девайсов, очень уж многое на них завязано. Для эксперимента можно удалить.
По ресурсам смотрел ничего оно не потребляет, можешь вообще прибить приложение, сообщения все равно доходят, можешь устройство отключить, включишь, они прийдут. В этом то и смысл что соединение GCM устройство и так поддерживает и данные от разных приложений по одному соединению передаются, вот представь что у нас десяток приложение типа того что в этой теме, молотят в цикле запросы на свои сервера, android ведь может и прибить ваши сервисы, аможет и пользователь прибить, что тогда через alarm поднимать?
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
16.09.2016, 06:24  [ТС]     Приём сообщений от сервера в фоне #36
REALIST07, Сервер не мой. и дел к сожалению с ним не имею. Доступа к нему нет работаю с чем дали.
1. Логику вашу уловил. Но просто тупо нехватает опыта такое написать, не понимаю! android разработкой 3 месяца занимаюсь.
2. Сервис использовать в первые буду.
3. Есть много нюансов которые мне не понятны.
3.1. Когда запускать сервис? в Аpp или в активити стартовой. В каждой активити или только раз его запускать?
3.2. Как и где обрабатывать полученные сообщения с сервиса, я так понял в сервисе подключение делать?
3.3. Передавать их с помощью Intenta?
Вообщем мне как новичку сложнаа.
По логики я должен сохранять все полученные данные, и потом сверять?

Добавлено через 1 час 1 минуту
REALIST07, Нужен пример короче) как отправить запрос с активити, и заполнить полученный ответ))
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
16.09.2016, 07:29     Приём сообщений от сервера в фоне #37
3.1. Когда запускать сервис? в Аpp или в активити стартовой. В каждой активити или только раз его запускать?
В каждой проверяй запущен или нет, если не запущен запускай.
3.2. Как и где обрабатывать полученные сообщения с сервиса, я так понял в сервисе подключение делать?
Подключаешься в сервисе. Обрабатываешь в сервисе... что там у тебя, в базу данных сохранить?
Цитата Сообщение от TonyBicbaev Посмотреть сообщение
3.3. Передавать их с помощью Intenta?
Куда передавать, в активити? local broadcast используй.
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
16.09.2016, 12:46  [ТС]     Приём сообщений от сервера в фоне #38
xaat,
а запрос, с помощью Intenta передавать же? putExtra?
JSON строка. как лучше эти данные заполнить? сразу в ArrayList распихать ? например мне приходит 20 объектов в строке.
JSON
1
2
строка в виде:
09-15 09:09:30.033 3451-3517/com.chat.chat_v100 E/m: m ={"type":"Connection","body":{"Type":"on","GroupID":null,"userT":"user","Id":41726,"chat":{"Id":41726,"Fio":"Усольцева Вера Витальевна (v_surkov@meshalkin.ru)","Email":"Гостиница ФГБУ ННИИПК Е.Н. Мешалкина","Phone":"","Readlytime":null,"LastMessage":null,"Site":null,"Status":null,"IP":"::1","Region":"::1","HomeTown":"::1","new_count_mes":null,"status_of_chat":null}}}[/quote]
В ocCreate проверять или onStart?
Цитата Сообщение от xaat Посмотреть сообщение
В каждой проверяй запущен или нет, если не запущен запускай.
Добавлено через 3 минуты
xaat, и еще, как сервис c App классом взаимодействовать будет?

Добавлено через 18 минут
REALIST07, и как хранения логина пароля пойдет SharedPreferences?

Добавлено через 2 часа 57 минут
REALIST07, кажется дошло, нужно все пропускать через App, типо как обертка?
REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
16.09.2016, 15:33     Приём сообщений от сервера в фоне #39
TonyBicbaev, про обертку все правильно
3.1 я запускаю в mainUI,при первой регистрации в LoginAvtivity,но потом уже не трогаю в MainUI
3.2 получаешь данные в сервисе, закидываешь в App обрабатываешь там и уже с помощью broadcastreceiver обновляешь нужные тебе activity
3.3 записываешь в sharedprefs , считываешь в App классе, а в сервисе берешь из App класса, к App классу можно обратиться везде где есть Context

Добавлено через 7 минут
Еще момент, в App классе можно хранить статическую ссылку на context если нужно и обращаться к нему из любого класса
Java
1
2
3
4
5
6
7
8
9
private static Context context;
    public static Context getAppContext() {
        return App.context;
    }
 
 @Override
    public void onCreate() {
        super.onCreate();
        App.context = getApplicationContext();
Вызываешь App.getAppContext(), в активити так не делают
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 09:39     Приём сообщений от сервера в фоне
Еще ссылки по теме:

Android WebView в фоне
Приём текста по Bluetooth. Ошибки в символах Android
Android Использование микрофона в фоне
Android Приём данных по Bluetooth
Повторение операции в фоне Android

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

Или воспользуйтесь поиском по форуму:
TonyBicbaev
 Аватар для TonyBicbaev
3 / 3 / 0
Регистрация: 04.11.2013
Сообщений: 118
19.09.2016, 09:39  [ТС]     Приём сообщений от сервера в фоне #40
REALIST07,
В общем вопрос)
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
public class MyService extends Service implements Handler.Callback {
    private WebSocketClient mWebSocketClient;
    private static Handler mHandler;
    private static final String SERVER = ""; //типо адресс
    final String LOG_TAG = "myLogs";
   // ExecutorService es;
 
    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "MyService onCreate");
     //   es = Executors.newFixedThreadPool(2);
        HandlerThread mThread = new HandlerThread("ServiceThread",
                Process.THREAD_PRIORITY_BACKGROUND);
        mThread.start();
        mHandler = new Handler(mThread.getLooper(), this);
    }
 
    public void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "MyService onDestroy");
    }
 
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "MyService onStartCommand");
        int method = 0;
        if (intent != null) {
            method = intent.getIntExtra("KEY_METHOD", 0);
        }
 
         mHandler.sendMessage(mHandler.obtainMessage(method, intent));
    //    int time = intent.getIntExtra(MainActivity.PARAM_TIME, 1);
     //   int task = intent.getIntExtra(MainActivity.PARAM_TASK, 0);
 
      //  MyRun mr = new MyRun(startId, time, task);
     //   es.execute(mr);
        connectWebSocket();
        return super.onStartCommand(intent, flags, startId);
    }
 
    public IBinder onBind(Intent arg0) {
        return null;
    }
    public void connectWebSocket() { /*метод подключения*/
 
        URI uri;
        try {
            uri = new URI(SERVER );   //сервер
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return;
        }
 
        mWebSocketClient = new WebSocketClient(uri,new Draft_17()) {
            @Override
            public void onOpen(ServerHandshake serverHandshake) {
                Log.i("Websocket", "Opened");
                mWebSocketClient.send("1.1.3#Логин;Пароль|"); //отпровляем команнду
 
              //  Log.i("e", "e" + s);
 
            }
 
            @Override
            public void onMessage(String s) { //получаем сообщение с сервера
                final String message = s;
                Log.e("m", "m =" + message);
               // treatmentMesage(message); //метод обработки сообщения
 
 
            }
 
            @Override
            public void onClose(int i, String s, boolean b) { //если потереннос соединеие
                Log.i("Websocket", "Closed " + s);
                if(!s.equals("null"))
                {
 
                }
 
                //  setQ(9);
 
            }
 
            @Override
            public void onError(Exception e) { //ошибка соединения
                Log.i("Websocket", "Error " + e.getMessage());
 
 
            }
        };
 
        mWebSocketClient.connect(); //создать подключение
 
 
 
    }
 
    @Override
    public boolean handleMessage(android.os.Message msg) {
        int method = msg.what;
        Log.e("int","int =" + method);
        try {
            switch (method) {
 
                case 0: {
                    // String username ="";
                    //  Intent intent = (Intent) msg.obj;
                    // username = intent.getStringExtra("key1");
                    Log.e("e11","e11");
                    App.sendLocalBroadcastMessage("KEY_METHOD", "KEY_METHOD");
                   /* mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            while (true) {
 
                            }
                        }
                    }, 5000);*/
 
                }
 
                case 1: {
 
 
                    // App.sendLocalBroadcastMessage("Операция2", result);
                    break;
                }
 
 
                default:
 
                    break;
            }
 
 
 
 
        } catch (Exception e)
        {
 
        }
        return false;
    }
ок да запускаю, соединение есть. сообщения приходят, но в слушатель обратно не приходит.
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
public class App extends Application {
    private static Context context;
    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        Log.e("e14","e14");
        //startService(new Intent(this, XmppService.class));
    }
 
    public static boolean sendLocalBroadcastMessage(String action,String result) {
        Intent sendIntent = new Intent(action);
        sendIntent.putExtra("KEY_METHOD",result);
        Log.e("e15","e15");
        return LocalBroadcastManager.getInstance(context).sendBroadcast(sendIntent);
    }
    public static void setListeners(final Context context) {
        Intent intent = getServiceIntent(context);
        context.startService(intent);
 
    }
 
    public static Intent getServiceIntent(final Context context) {
        return new Intent(context, XmppService.class);
    }
}
и маин
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  String MAIN_ACTIVIVTY = "KEY_METHOD";
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      //  app = (App) getApplication();
      //    app.startService(new Intent(this, XmppService.class));
        context = getApplicationContext();
 
       // App.setListeners(context);
        startService(new Intent(this,MyService.class).putExtra("KEY_METHOD",0));
        IntentFilter in = new IntentFilter(MAIN_ACTIVIVTY);
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int task = intent.getIntExtra("KEY_METHOD", 0);
            Log.e("e","e"); // по сути должен был вывести в логах "e" 
            }
        },in);
не заходит в слушатель. в чем ошибка?
ну то есть вот этот кусок кода уже не обрабатывает.
Java
1
2
3
4
5
6
7
  LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int task = intent.getIntExtra("KEY_METHOD", 0);
            Log.e("e","e"); // по сути должен был вывести в логах "e", нечего не выводит.
            }
        },in);
Добавлено через 4 часа 4 минуты
И так тоже нечего не происходит
Java
1
  App.setListeners(context);
Yandex
Объявления
19.09.2016, 09:39     Приём сообщений от сервера в фоне
Ответ Создать тему
Опции темы

Текущее время: 13:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru