- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我知道关于如何在服务和 Activity 之间进行通信的问题已经回答了很多次,但我也希望我自己的方式得到审查,并知道它是否是可接受的和正确的方式,以及什么是我如何处理它的缺点。首先,我将尽可能详细地陈述问题陈述。
我必须构建一个应用程序,在其中使用 Firebase 消息服务在两台设备之间进行通信。假设它是一个类似优步的系统。一个应用程序用于服务提供商(司机),一个应用程序用于客户(乘客)。当乘客请求使用他们的位置旅行时,一定半径内的司机将使用 Firebase 收到带有有效负载的推送通知。 Firebase 服务在后台运行。当服务收到推送通知时,onMessageReceived
方法被调用。生成一个事件。我没有在这里使用 Firebase 来生成通知,而是在我需要使用 data
时在设备之间传输数据。 Firebase 推送通知字段。现在,驱动程序应用程序将在 Firebase 推送通知的有效负载中接收用户想要汽车的位置的坐标。我可以简单地使用 extras 中的这些数据启动一个 Activity ,并向驱动程序显示收到了一个请求。
现在在客户方面,在客户提交请求后,他们将被带到下一个 Activity ,在那里他们被显示一种加载屏幕,告诉他们等待一个司机接受他们的请求。当其中一个驱动程序接受该用户的请求时,该用户现在将收到一个 Firebase 推送通知,该通知的有效负载中包含指定驱动程序的信息。同样,目的不是生成任何通知,而是在设备之间传输数据。
现在您了解了用例,我将继续讨论这个问题。
当用户提交请求并移动到下一个等待屏幕时,就会出现问题,在那里他会看到一个加载屏幕,告诉他们等待,而请求正在等待其中一位司机接受。当驱动程序接受请求时,正如我所说,用户将收到 Firebase 推送通知,其中驱动程序的信息包含在推送通知的有效负载中。我如何在服务和 Activity 之间进行通信,告诉 Activity 停止显示加载屏幕并用推送通知的有效负载中收到的数据填充 TextView。
以下是我的处理方式。假设我有一个名为 AwaitingDriver
的 Activity ,其中有要由驱动程序数据填充的 TextView。但目前该 Activity 正在显示加载屏幕,因为该请求尚未被接受。现在,用户在后台运行的服务中收到带有驾驶员信息的推送通知,未以任何方式连接到 Activity 。这是我的onMessageReceived
方法
@Override
public void onMessageReceived(RemoteMessage remoteMessage){
SharedPreferences rideInfoPref = getSharedPreferences(getString(R.string.rideInfoPref), MODE_PRIVATE);
SharedPreferences.Editor rideInfoPrefEditor = rideInfoPref.edit();
String msgType = remoteMessage.getData().get("MessageType");
if (msgType.equals("RequestAccepted")){
rideInfoPrefEditor.putBoolean(getString(R.string.is_request_accepted), true);
rideInfoPrefEditor.putString(getString(R.string.driver_phone), remoteMessage.getData().get("DriverPhone"));
rideInfoPrefEditor.putString(getString(R.string.driver_lat), remoteMessage.getData().get("DriverLatitude"));
rideInfoPrefEditor.putString(getString(R.string.driver_lng), remoteMessage.getData().get("DriverLongitude"));
rideInfoPrefEditor.commit();
AwaitingDriver.requestAccepted(); // A static method in AwaitingDriver Activity
}
}
AwaitingDriver.requestAccepted()
是
AwaitingDriver
的静态方法 Activity 。里面
AwaitingDriver
Activity 本身,它显示一个进度对话框来告诉客户等待,这是方法
AwaitingDriver.requestAccepted()
是在做。
public static void requestAccepted(){
try{
awaitingDriverRequesting.dismiss(); //ProgressDialog for telling user to wait
}catch (Exception e){
e.printStackTrace();
}
if (staticActivity != null){
staticActivity.new TaskFindSetValues().execute();
}
}
staticActivity
是
AwaitingDriver
的静态对象在此类中声明的 Activity 类。我将其值设置为
onResume
和
onPause
方法。这意味着如果 Activity 在前面,显示在屏幕上,那么
staticActivity
的值才会显示。不是
null
.这里是
onResume
和
onPause
方法。
@Override
public void onResume(){
super.onResume();
staticActivity = this;
Boolean accepted = rideInfoPref.getBoolean(getString(R.string.is_request_accepted), false);
if (accepted){
new TaskFindSetValues().execute();
}
}
@Override
protected void onPause(){
super.onPause();
staticActivity = null;
}
TaskFindSetValues
是在
AwaitingDriver
中定义的 AsyncTask Activity 课。这是
TaskFindSetValues
的代码
public class TaskFindSetValues extends AsyncTask<String, Void, String>{
String phone;
String lat;
String lng;
@Override
protected void onPreExecute(){
SharedPreferences pref = getSharedPreferences(getString(R.string.rideInfoPref), MODE_PRIVATE);
phone = pref.getString(getString(R.string.driver_phone), "");
lat = pref.getString(getString(R.string.driver_lat), "");
lng = pref.getString(getString(R.string.driver_lng), "");
}
@Override
protected String doInBackground(String... arg0){
return null;
}
@Override
protected void onPostExecute(String returnValue){
awaitingDriverPhone.setText(phone); //setting values to the TextViews
awaitingDriverLat.setText(lat);
awaitingDriverLng.setText(lng);
}
}
最佳答案
你为什么使用 AsyncTask?这没有意义。无论如何,如果您想与 Activity 进行通信,您可以使用 BroadcastReceiver
.
public class MyFirebaseMessagingService extends FirebaseMessagingService{
private LocalBroadcastManager broadcaster;
@Override
public void onCreate() {
broadcaster = LocalBroadcastManager.getInstance(this);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Intent intent = new Intent("MyData");
intent.putExtra("phone", remoteMessage.getData().get("DriverPhone"));
intent.putExtra("lat", remoteMessage.getData().get("DriverLatitude"));
intent.putExtra("lng", remoteMessage.getData().get("DriverLongitude"));
broadcaster.sendBroadcast(intent);
}
}
@Override
protected void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(this).registerReceiver((mMessageReceiver),
new IntentFilter("MyData")
);
}
@Override
protected void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
awaitingDriverRequesting.dismiss();
awaitingDriverPhone.setText(intent.getExtras().getString("phone")); //setting values to the TextViews
awaitingDriverLat.setText(intent.getExtras().getDouble("lat"));
awaitingDriverLng.setText(intent.getExtras().getDouble("lng"));
}
};
LocalBroadcastManager
现在已弃用!谷歌说要使用 LiveData 或 Reactive Streams。
关于android - 如何在 Firebase 消息服务和 Activity 之间进行通信?安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41925692/
我一直在读到,如果一个集合“被释放”,它也会释放它的所有对象。另一方面,我还读到,一旦集合被释放,集合就会释放它的对象。 但最后一件事可能并不总是发生,正如苹果所说。系统决定是否取消分配。在大多数情况
我有一个客户端-服务器应用程序,它使用 WCF 进行通信,并使用 NetDataContractSerializer 序列化对象图。 由于服务器和客户端之间传输了大量数据,因此我尝试通过微调数据成员的
我需要有关 JMS 队列和消息处理的帮助。 我有一个场景,需要针对特定属性组同步处理消息,但可以在不同属性组之间同时处理消息。 我了解了特定于每个属性的消息组和队列的一些知识。我的想法是,我想针对
我最近开始使用 C++,并且有一种强烈的冲动 #define print(msg) std::cout void print(T const& msg) { std::cout void
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
这个问题在这里已经有了答案: Firebase messaging is not supported in your browser how to solve this? (3 个回答) 7 个月前关
在我的 C# 控制台应用程序中,我正在尝试更新 CRM 2016 中的帐户。IsFaulted 不断返回 true。当我向下钻取时它返回的错误消息如下: EntityState must be set
我正在尝试通过 tcp 将以下 json 写入 graylog 服务器: {"facility":"GELF","file":"","full_message":"Test Message Tcp",
我正在使用 Django 的消息框架来指示成功的操作和失败的操作。 如何排除帐户登录和注销消息?目前,登录后登陆页面显示 已成功登录为“用户名”。我不希望显示此消息,但应显示所有其他成功消息。我的尝试
我通过编写禁用qDebug()消息 CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 在.pro文件中。这很好。我想知道是否可以
我正在使用 ThrottleRequest 来限制登录尝试。 在 Kendler.php 我有 'throttle' => \Illuminate\Routing\Middleware\Throttl
我有一个脚本,它通过die引发异常。捕获异常时,我想输出不附加位置信息的消息。 该脚本: #! /usr/bin/perl -w use strict; eval { die "My erro
允许的消息类型有哪些(字符串、字节、整数等)? 消息的最大大小是多少? 队列和交换器的最大数量是多少? 最佳答案 理论上任何东西都可以作为消息存储/发送。实际上您不想在队列上存储任何内容。如果队列大部
基本上,我正在尝试创建一个简单的 GUI 来与 Robocopy 一起使用。我正在使用进程打开 Robocopy 并将输出重定向到文本框,如下所示: With MyProcess.StartI
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
我得到了一个带有 single_selection 数据表和一个命令按钮的页面。命令按钮调用一个 bean 方法来验证是否进行了选择。如果不是,它应该显示一条消息警告用户。如果进行了选择,它将导航到另
我知道 MSVC 可以通过 pragma 消息做到这一点 -> http://support.microsoft.com/kb/155196 gcc 是否有办法打印用户创建的警告或消息? (我找不到谷
当存在大量节点或二进制数据时, native Erlang 消息能否提供合理的性能? 情况 1:有一个大约 50-200 台机器的动态池(erlang 节点)。它在不断变化,每 10 分钟大约添加或删
我想知道如何在用户登录后显示“欢迎用户,您已登录”的问候消息,并且该消息应在 5 秒内消失。 该消息将在用户成功登录后显示一次,但在同一 session 期间连续访问主页时不会再次显示。因为我在 ho
如果我仅使用Welcome消息,我的代码可以正常工作,但是当打印p->client_name指针时,消息不居中。 所以我的问题是如何将消息和客户端名称居中,就像它是一条消息一样。为什么它目前仅将消
我是一名优秀的程序员,十分优秀!