在后台运行一小时后重新启动我的应用程序

问题描述 投票:0回答:1

当用户在一小时后将应用程序置于后台时,我想重新启动我的应用程序。我已经做了一些研究并且使用了一项服务:

公共类BackgroundService扩展服务{

private static final long CHECK_INTERVAL = 60 * 60 * 1000; 
private Handler handler;
private long lastForegroundTime = 0;

@Override
public void onCreate() {
    super.onCreate();
    handler = new Handler();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            
            if (isAppInForeground()) {
                
                lastForegroundTime = System.currentTimeMillis();
                handler.postDelayed(this, CHECK_INTERVAL);
            } else {
                
                long elapsedTime = System.currentTimeMillis() - lastForegroundTime;
                if (elapsedTime > CHECK_INTERVAL) {
                    Intent restartIntent = new Intent(BackgroundService.this, MainActivity.class);
                    restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(restartIntent);
                } else {
                    handler.postDelayed(this, CHECK_INTERVAL - elapsedTime);
                }
            }
        }
    }, CHECK_INTERVAL);

    return START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    
    return null;
}

private boolean isAppInForeground() {
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    if (activityManager != null) {
        
        List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();
        if (processes != null) {
            for (ActivityManager.RunningAppProcessInfo process : processes) {
                if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    for (String packageName : process.pkgList) {
                        if (packageName.equals(getPackageName())) {
                            return true;
                        }
                    }
                }
            }
        }
    }
    return false;
}

}

但我知道该服务不是电池的最佳选择,并且我的服务仍然存在问题。您还有其他选择来做同样的事情吗?我听说我们可以使用 AlarmManager... 预先感谢。

我想在后台运行一小时后重新启动我的应用程序。

java android service background restart
1个回答
0
投票

也许可以尝试以下步骤,希望有帮助:

  1. 创建服务:重写 onStartCommand() 方法,在其中放置要执行的逻辑,我相信您已经这样做了。

  2. 在应用程序启动期间设置 AlarmManager:设置 AlarmManager 以定期或任何临时时间触发您的服务。您将使用 AlarmManager 安排您的服务以特定的时间间隔运行。

例如。

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyBackgroundService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);

// Schedule the alarm to start in one hour, and then repeat every hour
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pendingIntent);
  1. 在android清单中注册服务和权限:

<service android:name=".MyBackgroundService"/>
......
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
......

© www.soinside.com 2019 - 2024. All rights reserved.