繁体   English   中英

如何检查onCreate是否已杀死同一活动的先前android进程?

[英]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实例,但是我不知道如何以及是否可行。 任何提示将不胜感激。

  1. 您可以将进程的pid存储在共享首选项中。 如果在YourActivity.on中进行比较,请使用存储的ID创建当前pid,则可以确定何时必须初始化OpenSLES。
  2. 您可以在源自Application的类的YourApplication.onCreate中初始化OpenSLES-仅调用一次。

编辑:

即声明以下类:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM