[英]how to check in onCreate that the previous android process of the same activity has been killed?
我有一个活动,在该活动的onCreate方法中调用了一个Init函数(该函数调用一些涉及很多内容的本机代码,并调用openSLES音频api)。 关键是,此Init函数会使应用程序在再次调用时崩溃,发生在屏幕旋转或当我使用``后退''按钮关闭活动并再次启动它时发生的情况(但是与此同时,如果该进程被终止,则我没有任何麻烦)。 我无法更改Init函数的行为。
我看到活动被销毁后进程并未终止,我希望在阅读文档后能够做到这一点,这是一件好事,因为-如果正在播放一些音频信号-活动被销毁后仍会继续播放,这是对我的目的很好。
我尝试使用onSaveInstanceState对初始化状态进行检查,但仅在屏幕旋转时(即调用onSaveInstanceState时)才能很好地工作。 当我按下“后退”按钮时,不会调用该回调。
所以我尝试使用共享首选项,在onPause中执行状态保存。 但是在这一点上,我遇到了相反的问题:如果进程被终止,则共享首选项值会保留,但是在那种情况下,我需要再次执行Init才能使应用正常运行。
我想我需要一种方法来确定我的活动是否在进程终止后创建,但是目前我看不到。 我考虑过在onPause方法中使用bundle实例,但是我不知道如何以及是否可行。 任何提示将不胜感激。
编辑:
即声明以下类:
public class YourApplication extends Application {
static private native synchronized void InitOpenSLES();
public YourApplication() {}
// see http://developer.android.com/reference/android/app/Application.html#onCreate() for details
@Override
public void onCreate() {
super.onCreate();
InitOpenSLES();
}
}
对于每个进程,您都有pid或进程ID。 在您的init函数中,您可以轻松获取线程ID并将其保存为任何整数值。
Thread.currentThread()。getId()));
每当您的活动重新开始时,只需检查线程ID相同或不同即可。 如果线程ID不同,则调用函数init函数。 否则,您已经完成了。
这个问题有一个简单的解决方案。 您无需在SharedPreferences中保存内容即可完成此操作。 只需使用静态(类)变量。 像这样:
public class Globals {
public static boolean initialized = false;
}
加载类时, initialized
的变量将设置为false。 只有一次。 在代码中,然后检查并设置变量,如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initialize (but only once per process)
if (!Globals.initialized) {
init(); // Call init function that does things one time per process
Globals.initialized = true; // Remember we are initialized so we don't
// do it again
}
...
}
即使您的所有活动都已完成,但如果操作系统没有终止您的进程,则如果再次启动该应用程序,则initialized
的变量仍将为“ true”。 一旦OS终止了进程,则下次启动应用程序并创建新进程时,变量将设置为“ false”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.