Android-使用广播接收器重新加载活动

时间:2018-09-03 14:25:38

标签: android broadcastreceiver

我正在开发一个android应用程序,并且有一个活动可以显示餐厅中的所有桌子。在此活动中,有一种方法可以根据客户是否在桌子上来更改桌子的颜色(桌子只是一个按钮)。

在客户的屏幕上,当他们选择表时,我的MYQSL数据库将更新,并且现在将用户分配给该表。

现在,当我打开地图屏幕时(请注意:这是应用程序上的服务员使用的,客户无法访问),表格将使用不同的颜色(它会检查数据库中的表格状态,如果为表分配了颜色,则为其他颜色。

但是,获取更新的地图的唯一方法是重新加载地图活动。我希望地图活动使用BroadcastReceiver()自动更新,但是我正努力寻找有关如何实现此功能的教程。当客户单击表格分配给自己时,我希望发送广播,自动重新加载地图活动...这可能吗?如果是这样,我该如何实施?

编辑:服务员和客户使用相同的应用程序,但使用的设备不同

ChooseTable活动为每个表提供一个on click侦听器,这将导致调用以下方法:

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 :(得分:1)

由于一切都在单独的设备上运行,所以我要做的是实现Firebase云消息传递: https://firebase.google.com/docs/cloud-messaging/android/client

启动应用程序后,设备会收到令牌。

设备收到此令牌后,您将把它发布到该设备行的新列(即FirebaseToken)下的数据库中(假设您有设备表)。

当表状态更新(即:用户选择一个表)并到达服务器时,您将拥有一个查询,该查询遍历注册到企业的每个设备,并发送推送通知。

然后在android应用中,您将运行一个运行Firebase的服务,该服务会接收推送通知(即:)

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
        }
    }
}

非常普遍。相对容易实现。如有任何疑问,我会尽力澄清。

如以下评论所述,最好使用群组消息传递。我不知道每个企业将拥有多少台设备,因此试图使它尽可能简单。

这是服务器端的示例。这只会将推送通知发送到电话,并将在您扩展的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 = ""});