我能否检测到Android是否已从Notification Intent/PendingIntent中杀死了应用程序(任务进程)?

wil*_*iff 3 android android-intent android-notifications android-pendingintent android-os-handler

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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果Android杀死应用程序进程并使用打包在PendingIntent中的Intent通过Notification重新打开它,我不知道如何确定应用程序进程是否被Android杀死.随后我不会重新初始化杀死应用程序进程会破坏的内容.

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

我找到了一个解决这个问题的hacky解决方案.使用:Android:在点击通知时始终启动顶级活动我可以在堆栈顶部打开活动,如果Android杀死应用程序进程并处理重新初始化,则会传递savedInstanceState.然后,每个活动负责使用原始通知意图中的额外内容将用户重定向到相应的活动.此方案的意图设置如下:

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);
Run Code Online (Sandbox Code Playgroud)

我是否可以在Intent上设置一个Action,Category或Flag,它将模拟重新打开应用程序进程,就好像是由用户完成但是在新的Intent/Activity上?

编辑:澄清最后一个问题(虽然看起来我的婴儿对Android的理解让我失望所以它可能没有意义):我是否可以在Intent上设置Action,Category或Flag,就像上面的代码段一样,这将允许我确定应用程序进程是否已被操作系统杀死?

Dav*_*ser 11

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

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

public static boolean initialized;
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)


col*_*ens 6

由于当应用程序被终止并重新启动时,进程ID会发生变化,因此您可以使用此代码进行检查:

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

onSavedInstanceState(Bundle outState){
   super.onSaveInstanceState(outState);
   outState.putInt("my_pid", Process.myPid());
}
Run Code Online (Sandbox Code Playgroud)

然后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
    }
}
Run Code Online (Sandbox Code Playgroud)