很多网站说到下面的方法可以实现全局变量
首先是从Application类派生一个自己的app类,
class MyApp extends Application {
private String myState;
public String getState(){
return myState;
}
public void setState(String s){
myState = s;
}
}
然后是在AndroidManifest.xml中修改Application定义
增加android:name=".MyApp"
这样就可以在程序中使用全局变量了
class Blah extends Activity {
@Override
public void onCreate(Bundle b){
...
MyApp appState = ((MyApp)getApplicationContext());
String state = appState.getState();
...
}
}
理论上说,只要进程不destory,这个全局变量是一定有效的,但使用中,我发现有异常情况,
我在使用SurfaceView的时候,如果使用了
this.setFocusableInTouchMode(true);
则这个SurfaceView会导致全局变量失效,包括App在内的所有对象都会被析构,以后再访问的时候,会重建。
这个问题很奇怪,找来找去,最后问题归到JNI代码上,
在JNI C侧代码,有这样一句:
surfaceControl->hide();
目前确定就是这一句导致所有全局变量失效,包括C侧的全局变量也会失效。
估计是这一句,导致Android系统认为本进程被终止了,或者后续界面是属于另一个进程的,因此重新启了
一个新进程来继续后面的工作。
经分析,实际上是这个surfaceControl没有初始化。但这个也很奇怪,没有初始化,怎么没出段错误,
而只是出现全局变量失效的问题,其它都一切正常?
可能是Android系统在这个地方,捕获了段错误,杀掉了进程,然后又重启了一个新的进程。