我正在开发一个Android应用程序,我想检测用户何时退出我的应用程序,无论是通过单击后退按钮或Home按钮。
同样,像onInit()
这样的事件在我的场景中会很有用,因为我只想让MyInıt
行动首先开始。
onDestroy()
不被调用,直到其他应用程序需要更多的内存
注意:这只适用于当您的目标是>= API14
你也可以使用Application.registerActivityLifecycleCallbacks(),当任何活动暂停后延迟Runnable
(将在用户离开应用程序时调用)到Handler
。当活动创建/启动/恢复时,从Handler
中删除Runnable
。所以当你在应用程序中导航时,你总是取消Runnable
,但如果另一个活动不是来自你的应用程序被激活- Runnable
将被调用。
我用这个来注销用户,当他离开我的应用程序,这里的代码回调:
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
private Handler handler;
private Runnable runLogout = new Runnable() {
@Override
public void run() {
//logoutUser()
}
};
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
handler = new Handler(getMainLooper());
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
handler.removeCallbacks(runLogout);
}
@Override
public void onActivityStarted(Activity activity) {
handler.removeCallbacks(runLogout);
}
@Override
public void onActivityResumed(Activity activity) {
handler.removeCallbacks(runLogout);
}
@Override
public void onActivityPaused(Activity activity) {
handler.postDelayed(runLogout, 1000);
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
然而,Runnable
不会在活动生命周期的上下文中运行,所以要在活动中使用它,你需要设置和检查一些应用程序范围的标志或广播一个意图。
如果你的活动是堆栈中的最后一个,那么用onKeyDown检测返回按钮将解决这个
的1/2home键有点棘手,没有绝对的方法,但你可以这样做,这对我的简单需求有效。
onUserLeaveHint是根据文档调用的,当用户单击home按钮或当某些事情打断你的应用程序(如一个传入的电话),所以要猜它是你使用onUserInteraction方法戳最后的用户交互时间。
现在,如果它在onUserLeaveHint之前足够接近,你可以假设(不保证,但对我来说已经工作到目前为止)home按钮是你的应用程序被推到后台(退出)的原因
不确定你的意图是什么在捕捉home键,无论如何这里有一个简单的方法来做到这一点,我使用100毫秒围栏围绕两个事件,我发现一直对我有效。注意:我只在少数手机上测试过,就像Android上的所有东西一样,你的里程会根据操作系统/硬件而有所不同(甚至是记录在案的东西,有时应该工作)
long userInteractionTime = 0;
@Override
public void onUserInteraction() {
userInteractionTime = System.currentTimeMillis();
super.onUserInteraction();
Log.i("appname","Interaction");
}
@Override
public void onUserLeaveHint() {
long uiDelta = (System.currentTimeMillis() - userInteractionTime);
super.onUserLeaveHint();
Log.i("bThere","Last User Interaction = "+uiLag);
if (uiDelta < 100)
Log.i("appname","Home Key Pressed");
else
Log.i("appname","We are leaving, but will probably be back shortly!");
}
onUserLeaveHint根据文档调用用户点击home键或当有东西打断你的应用程序(如来电),以便猜测是谁打来的使用onUserInteraction方法来标记最后的用户交互时间。
只是对Idistic给出的答案的一个小更正- OnUserLeaveHint()是而不是当您的活动被传入呼叫中断时调用。下面是Android文档中的代码片段-
作为活动生命周期的一部分在活动即将结束时调用进入后台作为用户选择的结果。例如,当当用户按Home键时,onUserLeaveHint()将被调用,但是当进入的电话呼叫导致呼叫中活动处于状态时自动带到前台,onUserLeaveHint()将不会在活动被中断时调用。
是的,检查应用程序的生命周期-当用户最小化或离开几个方法被调用时onPause ()原()和onDestroy ()
http://developer.android.com/reference/android/app/Activity.html在Application.ActivityLifecycleCallbacks
的帮助下,你可以跟踪哪个活动正在破坏,新的活动正在开始,但是当用户滑动或后退按钮(上一个堆栈)时,postdelayed
将不会调用,Activitystop
和destroy
将始终调用,当你在应用程序内部时,如果你想捕获用户滑动或后退按钮(上一个堆栈),那么这段代码将工作。
public class Yourapp extends Application implements Application.ActivityLifecycleCallbacks {
private Activity currentActivity;
private Handler closecheckhandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//do whatever you want
default:
super.handleMessage(msg);
}
}
};
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
currentActivity = activity;
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity destroActivity) {
if (currentActivity.equals(destroActivity)) {
closecheckhandler.sendEmptyMessage(//Custom Code);
} else {
//do whatever you want
}
}
}
您可以考虑的另一种选择是检查返回键或主键是否按下。这是通过覆盖onKeyDown()来完成的,监听返回键/home键并覆盖默认行为。
我发现了一个类似的问题,可能会帮助你。
Android:当按下后退键时提示用户保存更改
欢呼