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

休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述Android - 使用广播接收器重新加载活动相关的知识,希望能为你提供帮助。
我正在开发一个android应用程序,我有一个活动,显示餐厅的所有表。在此活动中,有一种方法可以根据客户是否在桌面上更改表格颜色(表格只是一个按钮)。
在客户的屏幕上,当他们选择他们的表时,我的mysql数据库会更新,现在用户已分配到该表。
现在,当我打开地图屏幕时(注意:这是应用程序上的服务员使用它,客户无法访问),表格将是不同的颜色(它检查数据库中的表状态,如果表格分配它是一种不同的颜色)。
但是,获取更新地图的唯一方法是重新加载地图活动。我希望使用BroadcastReceiver()自动更新地图活动,但我很难找到如何实现它的教程。当客户点击表格为其分配时,我希望发送广播,自动重新加载地图活动......这可能吗?如果是这样,我该如何实现它?
【Android - 使用广播接收器重新加载活动】编辑:服务员和客户使用相同的应用程序,但在不同的设备上
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); }

基本上我想要一些单击表格按钮时重新加载地图屏幕活动的方法。
答案由于一切都在不同的设备上运行,我要做的是实现firebase云消息传递:https://firebase.google.com/docs/cloud-messaging/android/client
启动应用程序时,设备会收到令牌。
当设备收到此令牌时,您将在该设备行的新列(即:FirebaseToken)下将其POST到您的数据库(假设您有一个设备表)。
当表状态更新时(即:用户选择一个表),并且该状态到达服务器时,您将有一个查询通过注册到业务的每个设备,并发送推送通知。
然后在Android应用程序上,您将运行一个firebase服务,接收推送通知(即:)
public class MyFirebaseMessagingService extends FirebaseMessagingService { NotificationManager notificationManager; @Override public void onMessageReceived(RemoteMessage remoteMessage) { Map< String,String> data = https://www.songbingjia.com/android/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 = https://www.songbingjia.com/android/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 = ""});


    推荐阅读