我正在做一个我必须在其中进行的项目
一个客户端应用的配置实时Internet连接状态
,即使该应用在后台运行。
我必须在
上显示它服务器端,特定天气设备已连接到Internet或 不是
我正在使用Firebase来执行此场景,但是它不起作用。
ConnectionService
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;
}
}
我尝试了所有方法,但是没有用。
将获得帮助。
谢谢
答案 0 :(得分:1)
如果您已经使用menifest.xml和返回的start_sticky注册了服务,则应该可以,但是还有另一种方法,您可以编写一个api来对服务器执行ping操作(在特定间隔后在服务中调用它),并且将时间戳保存为TRUE (如果isConnected),那么现在将时间戳和布尔值true一起保存,假设现在连接已关闭或单元已死,因为不会将任何更新发送到服务器, 对? 现在,它带来了reciver / admin应用程序的魔力(您想以图形方式显示此在线状态),现在编写另一个API,该API将使用时间戳获取保存的响应,并获取触发该获取API的当前时间,找到这两个时间戳记之间有差异,并在此处施加条件` (这里的差异是以秒为单位,因为我们使用的是时间戳)
if(timeDifference>60)`
{
echo "true";
}
else
echo "false";
通过这种方式,您可以获得实时的在线/离线状态 在您设置的接收器应用上
if(response.equals("true"))
{
textView.setText("ONLINE")
}
else
{
textView.setText("OFFLINE")
}
您也可以阅读此帖子的答案 Save Response to Server When Network Connection goes OFF
答案 1 :(得分:0)
您是否已在Manifest.xml中注册了服务?
为了使服务“保持粘性”,您应该覆盖onStartCommand
以返回START_STICKY