我试图找出使用 onResume 和 onPause 将侦听器实现到位置的最佳方法。最好我不能在 onPause 上关闭它并在 onResume 上重新连接。但是,当我想要的只是让 GPS 在应用程序期间保持打开状态时,我会一直断开重新连接。当按下主页(或其他应用程序正在中断)时,可以关闭 GPS 以节省电池电量。
有任何想法吗?
谢谢。
您的问题可以概括为“我如何判断我的应用何时移入/移出前台?” 我已经在两个需要识别这一点的不同应用程序中成功使用了以下方法。
当您更改活动时,您应该会看到以下生命周期事件序列:
Activity A onPause()
Activity B onCreate()
Activity B onStart()
Activity B onResume()
Activity A onStop()
只要这两个活动都是您的,您就可以创建一个单例类来跟踪您的应用程序是否是前台应用程序。
public class ActivityTracker {
private static ActivityTracker instance = new ActivityTracker();
private boolean resumed;
private boolean inForeground;
private ActivityTracker() { /*no instantiation*/ }
public static ActivityTracker getInstance() {
return instance;
}
public void onActivityStarted() {
if (!inForeground) {
/*
* Started activities should be visible (though not always interact-able),
* so you should be in the foreground here.
*
* Register your location listener here.
*/
inForeground = true;
}
}
public void onActivityResumed() {
resumed = true;
}
public void onActivityPaused() {
resumed = false;
}
public void onActivityStopped() {
if (!resumed) {
/* If another one of your activities had taken the foreground, it would
* have tripped this flag in onActivityResumed(). Since that is not the
* case, your app is in the background.
*
* Unregister your location listener here.
*/
inForeground = false;
}
}
}
现在创建一个与该跟踪器交互的基本活动。如果您的所有活动都扩展了此基本活动,您的跟踪器将能够告诉您何时移动到前台或后台。
public class BaseActivity extends Activity {
private ActivityTracker activityTracker;
public void onCreate(Bundle saved) {
super.onCreate(saved);
/* ... */
activityTracker = ActivityTracker.getInstance();
}
public void onStart() {
super.onStart();
activityTracker.onActivityStarted();
}
public void onResume() {
super.onResume();
activityTracker.onActivityResumed();
}
public void onPause() {
super.onPause();
activityTracker.onActivityPaused();
}
public void onStop() {
super.onStop();
activityTracker.onActivityStopped();
}
}