我知道关于如何在服务和活动之间进行通信的问题已被多次回答,但我也希望我自己的方式对此进行审核,并了解它是否是可接受的和正确的方法来执行此操作以及什么是我如何处理它的弊端.首先,我将尽可能详细地陈述问题陈述.
我必须构建一个应用程序,我使用Firebase Messaging Service在两个设备之间进行通信.让我们说它是一个类似Uber的系统.一个应用程序用于服务提供商(驱动程序),一个用于客户(乘客).当乘客请求使用其位置旅行时,某个半径范围内的驾驶员将使用Firebase获得有效负载的推送通知.Firebase服务正在后台运行.当服务收到推送通知时,onMessageReceived将调用方法.生成一个事件.我不是在这里使用Firebase来生成通知,但实际上在我需要使用dataFirebase推送通知字段时在设备之间传输数据.现在,驱动程序应用程序将在Firebase推送通知的有效负载中接收用户想要汽车的坐标.我可以简单地在附加内容中使用此数据启动活动,并向驱动程序显示已收到请求.
现在在客户方面,在客户提交请求之后,他们将被带到下一个活动,在那里他们将被显示一种加载屏幕,告诉他们等待其中一个驱动程序接受他们的请求.当其中一个驱动程序接受此用户的请求时,此用户现在将在推送通知的有效负载中收到带有指定驱动程序信息的Firebase推送通知.同样,目的不是生成任何通知,而是在设备之间传输数据.
既然您了解了用例,我将继续讨论该问题.
当用户提交请求并进入下一个等待屏幕时会出现问题,在该屏幕上显示一个加载屏幕,告诉他们在请求等待其中一个驱动程序接受时等待.当驱动程序接受请求时,正如我所说,用户将在推送通知的有效负载中收到带有驱动程序信息的Firebase推送通知.如何在服务和活动之间进行通信,告诉活动停止显示加载屏幕并使用推送通知的有效负载中接收的数据填充TextView.
这是我如何处理这个.假设我有一个名称的活动AwaitingDriver,其中TextView将由驱动程序的数据填充.但目前活动正在显示加载屏幕,因为该请求尚未被接受.现在,用户收到推送通知,其中包含在后台运行的服务中的驱动程序信息,而不是以任何方式连接到活动.这是我的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
}
}
Run Code Online (Sandbox Code Playgroud)
这AwaitingDriver.requestAccepted()是一种静态的AwaitingDriver活动方法.在AwaitingDriver活动本身内部,它显示了一个告诉客户等待的进度对话框,这是方法AwaitingDriver.requestAccepted()正在做的事情.
public static void requestAccepted(){
try{
awaitingDriverRequesting.dismiss(); //ProgressDialog for telling user to wait
}catch (Exception e){
e.printStackTrace(); …Run Code Online (Sandbox Code Playgroud) android static-methods android-asynctask firebase android-service-binding
我刚刚发现了在Android Studio中备份密钥库文件的重要性.我有两个使用此计算机发布的应用程序.两次我只是在Android Studio Build中使用"Generate APK"下拉菜单.我真的很感激一些说明,我可以在哪里找到Android Studio用于签署这些apks的密钥库文件,以及我还需要做些什么才能从PC上发布我的应用程序的更新.谢谢.
我的drawables文件夹中有这个xml 。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp"/>
<solid android:color="#ffffff"/>
</shape>
Run Code Online (Sandbox Code Playgroud)
我基本上是用它来为我设置为背景的任何视图添加圆角。但是我想知道的是如何使该视图的颜色/背景色调保持动态。因为可以说我有都需要它,圆角的,但都需要不同的颜色,在一分钟,我不必单独创建三个不同的绘制文件,并设置颜色为每个文件的三个视图。正如我在上面的文件中所做的。我已经尝试BackgroundTint在原始视图上使用,但是它不起作用。