Android - используйте Broadcast Receiver для перезагрузки активности - PullRequest
0 голосов
/ 03 сентября 2018

Я занимаюсь разработкой приложения для Android, и у меня есть одно действие, которое показывает все таблицы в ресторане. В рамках этого действия есть метод изменения цвета таблицы (таблица - просто кнопка) в зависимости от того, находится ли клиент за столом.

На экране клиента, когда они выбирают свою таблицу, моя база данных MYQSL обновляется, и пользователь теперь назначается таблице.

Теперь, когда я иду, чтобы открыть экран карты (примечание: это используется официантами в приложении, клиенты не могут получить к нему доступ), таблица будет другого цвета (она проверяет состояние таблицы в БД, если таблица назначена, это другой цвет).

Однако единственный способ получить обновленную карту - перезагрузить действие карты. Я хочу, чтобы действие карты обновлялось автоматически с помощью BroadcastReceiver (), но я изо всех сил пытаюсь найти учебное пособие о том, как это реализовать. Когда клиент нажимает на таблицу, чтобы присвоить себя ей, я хочу, чтобы трансляция была отправлена, автоматически перезагружая действие карты ... Возможно ли это? И если да, то как мне это реализовать?

РЕДАКТИРОВАТЬ: официант и клиент используют одно и то же приложение, но на разных устройствах

Действие ChooseTable имеет прослушиватель по нажатию для каждой таблицы, в результате чего вызывается следующий метод:

private void assignUserToTable(final int table, final String userid) {

        String url = "hidden";
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                if (response.trim().equals("success")) {
                    Toast.makeText(ChooseTable.this, "Welcome!", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ChooseTable.this, "Oops, something went wrong!", Toast.LENGTH_LONG).show();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(ChooseTable.this, "Error! " + error.toString(), Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {

                Map<String, String> params = new HashMap<>();
                params.put("table_id", String.valueOf(table));
                params.put("user", userid);
                return params;
            }
        };
        MySingleton.getInstance(this).addToRequestQueue(stringRequest);

    }

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

private void checkTables(){

        String url = "hidden";
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try{
                    JSONObject jsonObject = new JSONObject(response);
                    String success = jsonObject.getString("success");
                    JSONArray jsonArray = jsonObject.getJSONArray("toggles");

                    if(success.equals("1")){

                        for(int i=0; i<jsonArray.length(); i++){
                            JSONObject object = jsonArray.getJSONObject(i);
                            String tableid = object.getString("tableid");
                            if(Tbl1.getTag().equals(tableid)){
                                Tbl1.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl2.getTag().equals(tableid)){
                                Tbl2.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl3.getTag().equals(tableid)){
                                Tbl3.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl4.getTag().equals(tableid)){
                                Tbl4.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl5.getTag().equals(tableid)){
                                Tbl5.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl6.getTag().equals(tableid)){
                                Tbl6.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl7.getTag().equals(tableid)){
                                Tbl7.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            } else if(Tbl8.getTag().equals(tableid)){
                                Tbl8.setBackgroundColor(ContextCompat.getColor(WaitingStaffMapScreen.this, R.color.tableReq));
                            }
                        }

                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(WaitingStaffMapScreen.this, "Oops, something went wrong!", Toast.LENGTH_LONG).show();
                }


            }
        },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(WaitingStaffMapScreen.this, "Error! " +error.toString(), Toast.LENGTH_LONG).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {

                Map<String, String> params = new HashMap<>();
                params.put("table_id", "0");
                return params;
            }
        };
        MySingleton.getInstance(this).addToRequestQueue(stringRequest);
    }

По сути, мне нужны некоторые способы перезагрузки экрана карты при нажатии кнопки таблицы.

1 Ответ

0 голосов
/ 03 сентября 2018

Поскольку все работает на отдельных устройствах, я хотел бы реализовать облачные сообщения Firebase: https://firebase.google.com/docs/cloud-messaging/android/client

Когда приложение запускается, устройство получает токен.

Когда устройство получает этот токен, вы поместите его в свою базу данных (при условии, что у вас есть таблица устройств) в новом столбце (т. Е. FirebaseToken) для этой строки устройства.

Когда статус таблицы обновляется (т. Е. Пользователь выбирает таблицу) и обращается к серверу, у вас будет запрос, который проходит через каждое устройство, зарегистрированное в компании, и отправляет push-уведомление.

Тогда в приложении для Android у вас будет запущена служба Firebase, которая получает push-уведомление (т.е.:)

public class MyFirebaseMessagingService extends FirebaseMessagingService
{
    NotificationManager notificationManager;
    @Override public void onMessageReceived(RemoteMessage remoteMessage)
    {
        Map<String,String> data = remoteMessage.getData();
        if (data.get("title").equals("Update Tables")) {
             //Call logic to update the adapter
        }
    }
}

Очень общий смысл этого. Относительно прост в реализации. Любые вопросы, я могу сделать все возможное, чтобы уточнить.

Как сказано ниже, лучше всего использовать групповые сообщения. Я не знал, сколько устройств будет у каждого предприятия, поэтому старался сделать его максимально простым.

Вот пример на стороне сервера. Это просто отправит push-уведомление на телефон и будет получено в расширенном классе FirebaseMessagingService.

public bool SendMessage(string firebaseTokenId, FirebaseMessages type)
    {
        httpWebRequest = (HttpWebRequest)WebRequest.Create("http://fcm.googleapis.com/fcm/send");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Headers.Add("Authorization", "your key");
        httpWebRequest.Method = "POST";
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {

            var messageToSend = new Message()
            {
                to = firebaseTokenId,
                data = new DataPayload()
                {
                    title = firebaseMessages[type].title,
                    message = firebaseMessages[type].body,
                }
            };
            string json = JsonConvert.SerializeObject(messageToSend, Formatting.Indented);
            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }
    }
public enum FirebaseMessages
{
    UpdateTables
}

public class Message
{
    public DataPayload data {get;set;}
    public string to { get; set; }
}

    public class DataPayload
{
    public string title { get; set; }
    public string message { get; set; }
}

//on the on receive, this is a datapayload(not notification), so no push intent will ever be shown, hence you can leave the body null.
firebaseMessages.Add(FirebaseMessages.MessageReceived, new FirebaseMessage() { title = "Table Update", body = ""});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...