我正在尝试编写一个应用程序,在一段时间后恢复到前台时会执行特定操作。是否有一种方法可以检测应用程序何时被发送到后台或恢复到前台?
我正在尝试编写一个应用程序,在一段时间后恢复到前台时会执行特定操作。是否有一种方法可以检测应用程序何时被发送到后台或恢复到前台?
这些答案似乎不正确。当另一个活动开始和结束时,也会调用这些方法。你可以做的是保持一个全局标志(是的,全局变量不好:)并在每次启动新活动时将其设置为true。在每个活动的onCreate中将其设置为false。然后,在onPause中检查此标志。如果它为false,则表示您的应用正在进入后台或被杀死。
我成功地通过实现一个BaseActivity来监控应用程序从前台到后台再回到前台的导航,利用了onResume、onPause和onStop活动回调。以下是我的实现。
override fun onResume() {
super.onResume()
if (AppActivityState.state == AppState.ON_LAUNCHED) {
// We are in the first launch.
onLaunched()
} else {
if (AppActivityState.state == AppState.ON_BACKGROUND) {
// We came from background to foreground.
AppActivityState.state = AppState.ON_FOREGROUND
onForeground()
} else {
// We are just navigating through pages.
AppActivityState.state = AppState.RESUMED
}
}
}
override fun onPause() {
super.onPause()
// If state is followed by onStop then it means we will going to background.
AppActivityState.state = AppState.PAUSED
}
override fun onStop() {
super.onStop()
// App will go to background base on the 'pause' cue.
if (AppActivityState.state == AppState.PAUSED) {
AppActivityState.state = AppState.ON_BACKGROUND
onBackground()
}
}
public class BaseActivity extends Activity
{
static String currentAct = "";
@Override
protected void onStart()
{
super.onStart();
if (currentAct.equals(""))
Toast.makeText(this, "Start", Toast.LENGTH_LONG).show();
currentAct = getLocalClassName();
}
@Override
protected void onStop()
{
super.onStop();
if (currentAct.equals(getLocalClassName()))
{
currentAct = "";
Toast.makeText(this, "Stop", Toast.LENGTH_LONG).show();
}
}
}
所有活动都需要扩展BaseActivity。
当一个活动调用另一个活动(A->B)时,currentAct不等于getLocalClassName(),因为第二个活动(B)的onStart()在第一个活动(A)的onStop()之前被调用(https://developer.android.com/guide/components/activities.html#CoordinatingActivities)。
当用户按下主页按钮或在应用程序之间切换时,只会调用onStop(),然后currentAct等于getLocalClassName()。
private boolean isApplicationBroughtToBackground() {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(getPackageName())) {
return true;
}
}
return false;
}
现在你需要声明一个布尔变量:
public boolean wasPaused = false;
当你的活动进入后台时,请询问:
@Override
public void onPause(){
super.onPause();
if(isApplicationBroughtToBackground())
wasPaused = true;
}
@Override
public void onResume(){
super.onResume();
if(wasPaused){
lockScreen(true);
}
wasPaused = false;
}
就是这样。现在,当您的活动进入后台,稍后用户将其带到前台时,锁定屏幕将出现。
如果您想为应用程序的任何活动重复此行为,则必须创建一个活动(可以是BaseActivity),放置这些方法,并且所有活动都必须继承自BaseActivity。
我希望这对您有所帮助。
问候!
getRunningTasks()
不适用于生产代码,并且显然,一些应用因使用它而被下架。 - Nate