8

Android 操作系统在内存不足时会终止进程。场景:Android 终止应用程序进程,我通过 Android 启动器或最近任务列表(长按主页按钮)重新打开它。我可以使用以下方法检查 Android 是否在最近查看的活动的 onCreate() 方法中杀死了我的应用程序进程:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        // Re-initialise things that killing the app would have destroyed
    }
}

但是,如果 Android 杀死了应用程序进程,并且我使用封装在 PendingIntent 中的 Intent 通过通知重新打开它,我不知道如何确定应用程序进程是否被 Android 杀死。随后,我不会重新初始化杀死应用程序进程会破坏的东西。

有没有办法确定Android在从通知中打开新活动时是否杀死了应用程序进程?

我找到了一个解决这个问题的 hacky 解决方案。使用:Android:单击通知时始终启动顶部活动我可以在堆栈顶部打开活动,如果 Android 终止应用程序进程并处理重新初始化,则传递一个 savedInstanceState。然后,每个活动负责使用原始通知意图中的 Extras 将用户重定向到适当的活动。此场景的意图设置如下:

Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

是否可以在 Intent 上设置操作、类别或标志,以模拟重新打开应用程序进程,就像用户在新的 Intent / Activity 上完成的一样?

编辑:澄清最后一个问题(尽管我对 Android 的婴儿理解似乎让我失望,所以它可能没有意义):我可以在 Intent 上设置一个动作、类别或标志,就像上面的片段一样,这将允许我确定应用程序进程是否已被操作系统杀死?

4

2 回答 2

15

确定Android是否已经杀死进程然后创建新进程的最简单方法如下:

在您的根活动中(具有 ACTION=MAIN 和 CATEGORY=DEFAULT 的活动)创建一个公共静态布尔变量,如下所示:

public static boolean initialized;

onCreate()您的根 Activity 中,将此变量设置为true.

onCreate()所有其他活动中,您可以通过检查布尔值的状态来检查 Android 是否已终止/重新创建任务,如果应用尚未初始化,您可以重定向到根 Activity 或调用初始化方法或其他... 像这样:

if (!RootActivity.initialized) {
    // Android has killed and recreated the process and launched this
    //  Activity. We need to reinitialize everything now
    ... redirect to root activity or call reinitialize method
}
于 2015-04-22T15:45:11.080 回答
9

由于当应用程序被杀死并重新启动时进程ID会发生变化,您可以使用它来检查它:

onSaveInstanceState(Bundle outState)获取当前进程 ID 并将其保存在 outState 中:

onSavedInstanceState(Bundle outState){
   super.onSaveInstanceState(outState);
   outState.putInt("my_pid", Process.myPid());
}

然后onCreate(Bunde savedInstanceState)比较保存的进程id和当前进程id:

onCreate(Bundle savedInstanceState){
   if(savedInstanceState!=null){            
      if(savedInstanceState.getInt("my_pid",-1)==android.os.Process.myPid())
         // app was not killed    
      else
        // app was killed
    }
}
于 2017-11-25T08:07:02.030 回答