优雅地恢复后台服务和 Unity 活动

问题描述

我有一个 Android 应用程序,它包含两个主要部分:在应用程序生命周期开始时启动的 Unity 库和一个 Android 后台服务,它在单独的 HandlerThreads 上执行一些后端操作。

在应用程序启动时,它会启动后台服务和 Unity 模块:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Intent serviceIntent = new Intent(this,MainService.class);
        Intent unityIntent = new Intent(this,UnityPlayerActivity.class);

        startService(serviceIntent);
        startActivity(unityIntent);
    } 
}

后台服务执行以下操作:

  • 在 onCreate() 方法中启动了几个 HandlerThreads,
  • 实现 onStartCommand() 和 onDestroy() 方法
public class MainService extends Service {
public void onCreate() {
        super.onCreate();

        myHandlerThread_A = new MyHandlerThreadA();
        myHandlerThread_B = new MyHandlerThreadB();
        myHandlerThread_C = new MyHandlerThreadC();

        myHandlerThread_A.start();
        myHandlerThread_B.start();
        myHandlerThread_C.start();
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        // send here some msg to the HandlerThreads
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        myHandlerThread_A.quitSafely();
        myHandlerThread_B.quitSafely();
        myHandlerThread_C.quitSafely();

        myHandlerThread_A = null;
        myHandlerThread_B = null;
        myHandlerThread_C = null;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
}

我观察到的是,当应用程序在前台运行时,一切似乎都很好。当我更改当前的前台应用程序、按主页按钮等时,问题就会出现。从日志(我在代码清单中省略)我可以看到后台线程在一段时间后被操作系统销毁(称为 onDestroy)。我使用的是 Android 11。

我从 Android Services overview 学到的是,当资源再次可用时,操作系统将恢复服务。但在我的情况下,即使我返回应用程序(使其成为前台)也不会发生。再次启动后台服务的唯一方法是显式调用 startService 方法。这只会引发更多问题。

总结:

  1. 如何恢复后台服务,而无需再次调用 startService?有没有办法保留在 onCreate 方法中启动的线程?或者我应该从 onStartCommand 调用它们?

  2. 我还想也许我可以从 Activity lifecycle 中受益,但在我的实现中,Unity 活动似乎占据了整个控制权,如果我恢复应用程序,我看不到任何 onRestart 、 onStart 和 onResume 方法调用,因此我无法对 MainService 执行任何操作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...