我的 Java 单例实例何时/为什么被销毁?

2022-01-10 00:00:00 singleton android-ndk android java

我有一个 android 应用程序,它设置为启动一个 Java 活动(称为 MyJavaActivity),它反过来启动一个 NativeActivity.当 NativeActivity 完成时,它会返回到 MyJavaActivity.

I have an android app that is setup to start a Java activity (call it MyJavaActivity), which in turn launches a NativeActivity. When the NativeActivity finishes it returns back to MyJavaActivity.

我还有一个 Java 单例类(称为 MyJavaSingleton),我希望在我的应用程序的整个生命周期中将其保留在内存中.我从我的 NativeActivity(使用 JNI)中设置了一些单例类的成员变量,这些变量稍后可以由 MyJavaActivity 检索.

I also have a Java singleton class (call it MyJavaSingleton) which I would like to stay in memory throughout my application's lifecycle. I set some of the singleton class's member variables from my NativeActivity (using JNI), which can later be retrieved by MyJavaActivity.

问题是,MyJavaSingleton 实例似乎在 NativeActive 退出之前一直在内存中,但是当 MyJavaActivity 再次启动时,它似乎又被设置为 null,所以我在 NativeActivity 中设置的所有变量现在都重置为默认值.为什么会这样?

The problem is, MyJavaSingleton instance seems to be in memory until NativeActive exits, but somehow seems to be set to null again when MyJavaActivity starts up again, so all the variables I had set in NativeActivity are now reset to their defaults. Why does this happen?

 public class MyJavaActivity extends Activity implements View.OnTouchListener
 {
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
    super.onCreate(savedInstanceState);
    MyJavaSingleton.Instance().DoStuff();
   }

   @Override
   public boolean onTouch(View arg0, MotionEvent arg1) 
   {
      Intent intent = new Intent(MyJavaActivity.this, NativeActivity.class);
      startActivity(intent); // at this point, android_main will be executed 
   }
 }

 /////////////////////////////
 public class MyJavaSingleton
 {
   static private MyJavaSingleton mInstance = null;
    synchronized public static MyJavaSingleton Instance()
{
    if( mInstance == null )
    {
        mInstance = new MyJavaSingleton();
        Log.v(TAG, "New MyJavaSIngleton instance");
    }
    return mInstance;
}
 }
 /////////////////////////////
 // Native 
 void android_main(struct android_app* state) 
 {
     // Do various stuff, set some variables on the MyJavaSingleton
     // At this point, MyJavaSingleton.mInstance is still at the same address in memory, which is good //
     ANativeActivity_finish(state->activity);
     exit(0);
     // Problem: sometime after this exit and before MyJavaActivity::onCreate is called, MyJavaSingleton.mInstance is set to null! 
 }

在上面的代码提取中,New MyJavaSIngleton instance"在应用第一次启动时打印,然后在NativeActivity退出后(即android_main退出后)再次打印,并再次调用MyJavaActivity的onCreate.

In the above code extraction, "New MyJavaSIngleton instance" is printed when the app is first started, and then again right after the NativeActivity exits (ie after android_main is exited) and MyJavaActivity's onCreate is called again.

为什么重新进入MyJavaActivity时MyJavaSingleton.mInstance变成NULL了?

Why does MyJavaSingleton.mInstance become NULL when reentering MyJavaActivity?

推荐答案

每个 Android 应用程序都在自己的进程中运行,只要它继续运行,您的单例就可用.当进程终止时,你的单例就丢失了.因此,当应用重新启动时,需要重新创建这个单例对象.

Each Android app runs in its own process so as long as it keeps running, your singleton will be available. When the process dies, your singleton is lost. Therefore when the app is re-launched this singleton object will need to be re-created.

相关文章