有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java My app在正面全屏应用程序后冻结

我正在努力解决在后台运行MQTT ServiceConnection的Android应用程序的持久问题。当我切换到另一个具有全屏界面的应用程序(游戏、全屏上的youtube等)时,当我再次尝试将其置于前端时,该应用程序会完全冻结。如果从抽屉关闭,它甚至拒绝重新启动。除非完全关闭,否则应用程序不会重新打开。奇怪的是,如果我通过调试器运行应用程序,它会工作得很好。这使这个问题很难处理。在每个生命周期方法的开始,甚至在调用超级类方法之前,我就已经打印了。当应用程序挂起时,它们都不会被打印出来,这暗示着它在系统级的某些地方挂起。 现在,如果我调用stopService-at-onStop方法,它可以正常工作,但无法实现在后台提供持久服务的目的。我也在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服务正在接收消息,并且没有产生错误。即使应用程序被挂起,也会继续收到消息,以便后台服务处于活动状态并运行。 内联服务连接类如下所示:

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) 个答案