问题描述
我有一个 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);
}
}
后台服务执行以下操作:
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 方法。这只会引发更多问题。
总结:
-
如何恢复后台服务,而无需再次调用 startService?有没有办法保留在 onCreate 方法中启动的线程?或者我应该从 onStartCommand 调用它们?
-
我还想也许我可以从 Activity lifecycle 中受益,但在我的实现中,Unity 活动似乎占据了整个控制权,如果我恢复应用程序,我看不到任何 onRestart 、 onStart 和 onResume 方法被调用,因此我无法对 MainService 执行任何操作。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)