我有一个有三个活动的应用程序,用户将在这三个活动之间不断进行标记。在用户关闭应用程序之前,我的代码会从Internet下载当前时间并存储它。问题是我有我的代码用于在onPause()方法中下载时间。这导致每次用户切换活动时都会反复下载数据。我尝试使用onDestroy(),但下载永远不会开始。当用户完全最小化或关闭应用程序而不是在活动开关上调用的应用程序时,是否有一个方法被调用? 非常感谢,任何帮助表示赞赏!
答案 0 :(得分:0)
我们可以使用Application
类来实现这一点。在那里,我们可以实现ActivityLifecycleCallbacks
来确定我们的应用程序何时进入后台,并根据该结果我们可以执行所需的任务。这里有一个示例代码:
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
private Handler mHandler;
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
}
...
@Override
public void onActivityResumed(Activity activity) {
Log.i("Activity Resumed", activity.getLocalClassName());
// cancel scheduled download operation (if any)
mHandler.cancelCallbacksAndMessages(null);
}
@Override
public void onActivityPaused(Activity activity) {
Log.i("Activity Paused", activity.getLocalClassName());
// schedule a download operation after 5 seconds
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
performDownloadOperation()
}
}, 5000);
}
... // other lifecycle callbacks
private void performDownloadOperation() {
// perform download operation here
}
}
在上面的代码中,我们基本上给用户[和系统]一个5秒的宽限时间来从一个活动切换到另一个活动。否则,我们注意到应用程序转到后台并在那里做我们的工作。因此,即使用户切换到另一个应用程序4秒然后再回来,我们仍然不会下载数据,这在大多数情况下应该没问题。
请注意,要使用上述类,您需要在清单文件的android:name
标记下提供android:name=".MyApplication"
属性的类引用<application>
。
答案 1 :(得分:0)
您可以使用Activity::isFinishing()
。当您(1)启动另一个活动或(2)将应用程序放在后台时,这将返回false,但是当(3)按下后退按钮或者(4)某人调用finish
时,它将返回true关于活动。
如果区分(1)和(2)很重要,那么您可以随时保留一个标记,每次启动活动时都可以切换,并在onPause
中重置。