android - Firebase:服务中的 onDisconnect()
问题描述
我正在做一个我必须做的项目
配置实时互联网连接状态
一个客户端应用程序,即使应用程序在后台。
我必须显示它
天气特定设备是否连接到互联网的服务器端
我正在使用 Firebase 来执行此场景,但它不起作用。
连接服务
public class ConnectionService extends Service implements ConnectivityReciever.ConnectivityRecieverListner {
public static final int notify = 5000;
private Handler mHandler=new Handler();
private Timer mTimer = null;
FirebaseDatabase db;
DatabaseReference dbRef;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
dbRef=FirebaseDatabase.getInstance().getReference(Common.DEVICE_NAME).child("online");
MyApplication.getInstance().setConnectivtyListner(ConnectionService.this);
boolean isConnected=ConnectivityReciever.isConnected();
checkConnection(isConnected);
if(mTimer!=null){
mTimer.cancel();
}else{
mTimer=new Timer();
mTimer.scheduleAtFixedRate(new TimeDisplay(),0,notify);
}
}
private void checkConnection(boolean isConnected) {
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(ConnectionService.this, "Service is destroyed", Toast.LENGTH_SHORT).show();
}
@Override
public void onNetworkConnectionChanged(boolean isConnected) {
if(isConnected){
dbRef.onDisconnect().setValue("true");
Toast.makeText(ConnectionService.this, "online", Toast.LENGTH_SHORT).show();
}
if(!isConnected){
dbRef.onDisconnect().setValue(ServerValue.TIMESTAMP);
Toast.makeText(ConnectionService.this, "offline", Toast.LENGTH_SHORT).show();
}
}
//class TimeDisplay for handling task
class TimeDisplay extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
MyApplication.getInstance().setConnectivtyListner(ConnectionService.this);
boolean isConnected=ConnectivityReciever.isConnected();
checkConnection(isConnected);
// display toast
Toast.makeText(ConnectionService.this, "Service is running", Toast.LENGTH_SHORT).show();
}
});
}
private void checkConnection(boolean isConnected) {
if(isConnected){
dbRef.setValue("true");
Toast.makeText(ConnectionService.this, "online", Toast.LENGTH_SHORT).show();
}
if(!isConnected){
dbRef.child("online").onDisconnect().setValue(ServerValue.TIMESTAMP);
Toast.makeText(ConnectionService.this, "offline", Toast.LENGTH_SHORT).show();
}
}
}
}
申请
public class MyApplication extends Application {
public static MyApplication mInstance;
DatabaseReference dbRef;
@Override
public void onCreate() {
super.onCreate();
mInstance=this;
Common.DEVICE_NAME = android.os.Build.MODEL;
FirebaseApp.initializeApp(this);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
public static synchronized MyApplication getInstance(){
return mInstance;
}
public void setConnectivtyListner(ConnectivityReciever.ConnectivityRecieverListner listner){
ConnectivityReciever.connectivityReceiverListener = listner;
}
}
我已经尝试了所有方法,但没有任何效果。
将得到帮助。
谢谢
解决方案
如果您已使用 menifest.xml 和返回的 start_sticky 注册您的服务,它应该可以工作,但还有另一种方法,您可以编写一个 api 来 ping 服务器(在特定时间间隔后在服务中调用它),并节省时间用 TRUE 标记(如果 isConnected),所以现在时间戳与布尔值 true 一起保存,假设现在连接关闭或单元已死,因为不会向服务器发送更新,对吗?现在它来了接收器/管理应用程序的魔力(您想以图形方式显示此在线状态),现在编写另一个 API,它将获取带有时间戳的已保存响应并获取触发此获取 API 的当前时间,找到这两个时间戳的黑白差异&
if(timeDifference>60)`
{
echo "true";
}
else
echo "false";
通过这种方式,您可以在您设置的接收器应用程序上获得实时在线/离线状态
if(response.equals("true"))
{
textView.setText("ONLINE")
}
else
{
textView.setText("OFFLINE")
}
进一步你也可以阅读这个帖子的答案 当网络连接关闭时保存对服务器的响应
推荐阅读
- html - 如何移动右侧表格边距旁边的滚动条
- android - 使用 MediaCodec 和 MediaMuxer 将 PCM 编码为 AAC 时没有音频
- azure-ad-b2c - 在 Azure Ad B2C 中自助密码重置需要进行 2 次电子邮件验证
- java - 无法在索引中查看 ElasticSearch 创建的文档
- swift - HackerEarth 中的 Unlucky 13 挑战
- node.js - 如何修复此错误:找不到模块“moz”Nodejs
- c# - WPF 如何在数据网格中使用行标题更改列的标题样式?
- maas - MAAS 显示机器的许多核心
- apple-appclips - 为什么 App Clip Code 有效载荷大小限制如此之小
- haskell - Data.Vector.Storable.ZipWith 中的慢流融合,但 Data.Vector.Unboxed.ZipWith 中的快速流融合