我的应用程序在前面全屏应用程序后冻结

时间:2017-11-29 09:59:15

标签: java android mqtt paho

我正在努力解决在后台运行MQTT ServiceConnection的Android应用程序的持续性问题。当我切换到具有全屏表面的其他应用程序(游戏,全屏幕上的youtube等)时,应用程序在尝试再次将其置于前面时完全冻结。如果从抽屉关闭,它甚至拒绝重新启动。该应用程序除非完全被杀,否则不会重新打开。奇怪的是,如果我通过调试器运行应用程序,它可以很好地工作。这使问题难以处理。我在每个生命周期方法的开头都进行了打印,甚至在调用超类方法之前。当应用程序挂起时,它们都不会打印出来,这暗示它会在系统级别挂起一些位置。 现在,如果我在onStop方法上调用stopService,它可以正常工作,但是在背景上无法实现持久服务。我也在onStop上调用了unbindService,但它没有帮助。所有其他应用程序一切正常,即使你没有在全屏使用管。 对MQTT库的依赖是

compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'

这是我的onStop()方法

@Override
protected void onStop() {
    FirebaseUserActions.getInstance().end(getIndexApiAction0());
    if(mBoundToService) {
        try {
            unbindService(serviceConnection);
            mBoundToService = false;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    super.onStop();
}

onStart()方法就是这样:

@Override
protected void onStart() {
    Log.d(TAG, "onStart has been called");
    super.onStart();
    if(!mBoundToService) {
        bindService(mqttIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    }
    FirebaseUserActions.getInstance().start(getIndexApiAction());
}

但这永远不会被召唤。从日志中我可以看到MQTT服务正在接收消息并且不会产生错误。即使应用程序被挂起,也会继续收到消息,因此后台服务处于活动状态并且正在运行。 内联的Service连接类如下所示:

private ServiceConnection serviceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder binder)
        {
            mqttService = ((MQTTService.MyBinder) binder).getService();
            mBoundToService = true;

            Log.d(TAG,"MQTT service has been bound");

            Handler handler = getHandler();
            //NOTIFY THE LOGIN ACTIVITY THAT THE DATA HAS BEEN ACQUIRED
            Message msg = handler.obtainMessage(Utils.HANDLE_MQTT_SERVICE_CONNECTED);
            Bundle bundle = new Bundle();
            bundle.putString(Utils.KEY_MQTT_SERVICE_BOUND,"Everything is complete");
            msg.setData(bundle);
            handler.sendMessage(msg);
        }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mBoundToService = false;
        Log.d(TAG, "MQTT service has been UNbound");
    }
};

MQTT服务从onCreate()开始:

mqttIntent = new Intent(getApplicationContext(), MQTTService.class);
if(!mBoundToService){
    Log.d(TAG,"Starting MQTT Intent");
    startService(mqttIntent);
    Log.d(TAG,"Binding MQTT Service");
    bindService(mqttIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}

我是否遗漏了一些我应该在onStop()上做的事情,以便能够在前面全屏应用后恢复应用程序?

0 个答案:

没有答案