返回

Android 应用进程终止处理指南:让你的 App 顽强生存

Android

Android 应用进程终止处理指南

挑战:应用进程意外终止

在 Android 系统中,应用程序进程可能会被系统无情地终止以释放内存和节省电池电量。这会导致应用程序失去状态并中断用户体验。

解决方案:监听进程终止

为了应对这一挑战,有几种方法可以监听应用程序进程的终止:

1. 前台服务

前台服务是一种特殊服务,即使应用程序在后台运行,它也会保持活动状态。当进程终止时,前台服务会继续运行,直到显式停止或应用程序重新启动。

2. 进程守护程序

进程守护程序是一个独立应用程序,专门用于在主应用程序进程终止后继续运行。它可以监视主应用程序状态,并在其终止时重新启动它。

3. JobSchedulerCompat 库

JobSchedulerCompat 是一个流行的库,它提供了安排任务在特定时间或条件下运行的 API。你可以使用 JobSchedulerCompat 在应用程序进程终止后安排任务重新启动服务。

4. App Standby Bucket(Android 12 及更高版本)

App Standby Bucket 是 Android 12 中引入的一项机制,对应用程序的电池消耗进行分类。它允许应用程序在待机状态下执行某些操作,例如后台服务。

选择最佳方法

选择最合适的进程终止处理方法取决于应用程序的特定需求:

  • 前台服务适合需要保持持续运行的应用程序(例如音乐播放器或导航应用程序)。
  • 进程守护程序适用于需要在后台定期执行任务的应用程序(例如数据同步或通知)。
  • JobSchedulerCompat 适用于需要在特定时间点执行任务的应用程序(例如备份或更新)。
  • App Standby Bucket 对于需要在待机状态下保持活动的应用程序(例如信使服务或紧急警报)非常有用。

示例代码

以下是一个使用 JobSchedulerCompat 在应用程序进程终止后重新启动服务的示例代码:

// JobService.java
public class JobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        // 执行在进程终止后要执行的操作

        // 通知系统已完成工作
        jobFinished(params, false);

        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        // 如果作业被意外中断,可以重新安排它

        return true;
    }
}

// MainActivity.java
public class MainActivity extends Activity {

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

        // 检查应用程序是否已从后台终止
        if (isAppKilled()) {
            // 重新启动应用程序
            Intent intent = new Intent(this, JobService.class);
            JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
            jobScheduler.schedule(new JobInfo.Builder(1, intent)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                .setPersisted(true)
                .build());
        }
    }

    private boolean isAppKilled() {
        // 检查应用程序是否已从后台终止
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
        for (RunningAppProcessInfo runningAppProcess : runningAppProcesses) {
            if (runningAppProcess.processName.equals(getPackageName())) {
                return runningAppProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
            }
        }
        return false;
    }
}

常见问题解答

1. 为什么我的应用程序的 onDestroy() 方法没有被调用?

由于 Android 系统可能会突然终止应用程序进程,因此 onDestroy() 方法可能不会总是被调用。

2. 进程守护程序和前台服务有什么区别?

进程守护程序是一个独立应用程序,而前台服务是属于主应用程序的一个服务。进程守护程序可以监视和重新启动多个应用程序,而前台服务只能监视和重新启动其所属的应用程序。

3. 如何在 App Standby Bucket 中保持应用程序活动?

你可以使用 JOB_SCHEDULER_RUN_ANYTIME 权限或 AlarmManager.setAndAllowWhileIdle() 方法在 App Standby Bucket 中保持应用程序活动。

4. JobSchedulerCompat 适用于哪些 Android 版本?

JobSchedulerCompat 适用于 Android 4.1(API 16)及更高版本。

5. 如何选择最合适的进程终止处理方法?

选择最合适的进程终止处理方法取决于应用程序的特定需求,例如是否需要保持持续运行、在后台定期执行任务或在特定时间点执行任务。