【发布时间】:2011-09-21 17:27:41
【问题描述】:
我有一个 android 应用程序,它设置为启动一个 Java 活动(称为 MyJavaActivity),它反过来启动一个 NativeActivity。当 NativeActivity 完成时,它会返回到 MyJavaActivity。
我还有一个 Java 单例类(称为 MyJavaSingleton),我希望在我的应用程序的整个生命周期中将其保留在内存中。我从我的 NativeActivity(使用 JNI)中设置了一些单例类的成员变量,这些变量稍后可以由 MyJavaActivity 检索。
问题是,MyJavaSingleton 实例似乎在 NativeActive 退出之前一直在内存中,但是当 MyJavaActivity 再次启动时,它似乎又被设置为 null,所以我在 NativeActivity 中设置的所有变量现在都重置为默认值。为什么会这样?
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。
为什么重新进入MyJavaActivity时MyJavaSingleton.mInstance变成NULL了?
【问题讨论】:
-
你为什么要调用exit()?这不会杀死JVM,还是我对Android一无所知?
-
是的,我也不喜欢调用 exit(),我觉得这是一个 hack,但除非我这样做,否则应用程序似乎不会返回到 MyJavaActivity。
-
@lost_bits1110
finish()不起作用? -
正如@James 所说,你单身应该是私人的。另外,正如所写,
Instance()应该是synchronized。 -
@DeeV 不,在我上面的代码 sn-p 中,您可以看到我调用原生等效于 'finish()
, which isANativeActivity_finish. With only this (and noexit()), the app does not return toMyJavaActivity, it simply stops at the last screen thatNativeActivity `正在显示。 @Hemal 我在之前的评论中提到了这一点 - 但我最初将其设置为private并且行为是相同的。我尝试添加“同步”,但结果仍然相同:(我将更新上面的代码以显示这两个更改。
标签: java android singleton android-ndk