当用户在一小时后将应用程序置于后台时,我想重新启动我的应用程序。我已经做了一些研究并且使用了一项服务:
公共类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... 预先感谢。
我想在后台运行一小时后重新启动我的应用程序。
也许可以尝试以下步骤,希望有帮助:
创建服务:重写 onStartCommand() 方法,在其中放置要执行的逻辑,我相信您已经这样做了。
在应用程序启动期间设置 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);
<service android:name=".MyBackgroundService"/>
......
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
......