我有一个android应用程序,我需要一个功能或任何可以检查应用程序是否关闭而不关闭活动的东西。我有一个这样的应用程序,如果您在任何活动中使用应用程序10秒钟,无论何时何地,您都将收到“超时”通知。我使用计时器来执行此操作,开始时一切正常。但是,当我关闭应用程序时,该应用程序必须保存timeLeft以便下次启动。例如:如果我只剩下5秒钟,那么我将关闭App。下次我打开该应用程序时,计时器将从5秒开始,而不是10秒开始。如果我呆在WelcomeFirst(初始化计时器的活动)上没有问题,但是如果我进入下一个活动,计时器将被取消。我不希望那样,计时器只会在应用程序关闭时取消。
是否可以检查应用程序是否已关闭或活动是否已关闭?我使用ActivityLifecycleCallbacks和应用程序类。我也尝试这个功能
private boolean isAppRunning() {
ActivityManager m = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> runningTaskInfoList = m.getRunningTasks(10);
Iterator<ActivityManager.RunningTaskInfo> itr = runningTaskInfoList.iterator();
int n=0;
while(itr.hasNext()){
n++;
itr.next();
}
if(n==1){ // App is killed
return false;
}
return true; // App is in background or foreground
}
它不起作用。
我的代码
public class App extends Application implements Application.ActivityLifecycleCallbacks {
private Long START_TIME_IN_MILLIS = 6000;
private Boolean mTimerRunning = false;
private Long mTimeLeftInMillis = START_TIME_IN_MILLIS;
private CountDownTimer mCountDownTimer;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityStarted(Activity activity) {
//if the activity is WelcomeFirst then init the timer
if (activity.localClassName == "WelcomeFirst") {
SharedPreferences prefs = getSharedPreferences("prefsDay", Context.MODE_PRIVATE);
mTimeLeftInMillis = prefs.getLong("millisLeft", 10000);
mTimerRunning = prefs.getBoolean("timerRunning", false);
startTimer();
}
}
@Override
public void onActivityStopped(Activity activity) {
//The code below mean if the Activity WelcomeFirst is closed then save the millisLeft for the next start.
if (activity.localClassName == "WelcomeFirst") {
mCountDownTimer.cancel();
mTimerRunning = false;
SharedPreferences prefs = getSharedPreferences("prefsDay", Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.apply();
}
//I want to make the change. If The App is closed, then save the millisLeft for the next start.
//Not the Activity is closed, then save the millisLeft for the next start
}
private void startTimer() {
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
}
@Override
public void onFinish() {
mTimerRunning = false;
Toast.makeText(this, "Time Out",Toast.LENGTH_SHORT).show()
}
}.start();
mTimerRunning = true;
}
答案 0 :(得分:0)
使用processLifeCyclerManager将解决您的问题。 https://medium.com/trendyol-tech/android-architecture-components-processlifecycleowner-26aa905d4bc5