我正在开发一个Android应用程序,我想通过单击“返回”按钮或“主页”按钮来检测用户何时退出我的应用程序。
此外,像onInit()
这样的事件在我的方案中会很有用,因为我只想先启动MyInıt
操作。
onDestroy()
。
答案 0 :(得分:26)
您还可以使用 Application.registerActivityLifecycleCallbacks(),并在任何活动暂停时将延迟Runnable
(将在用户左侧应用时调用)发布到Handler
。在创建/启动/恢复活动时,您从Runnable
中删除Handler
。因此,当您在应用内导航时,您始终取消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
不会在活动生命周期的上下文中运行,因此要在活动中使用它,您需要设置并检查一些应用程序范围的标记或广播意图。
答案 1 :(得分:18)
如果您的活动是堆栈中的最后一个,那么使用onKeyDown检测后退按钮将解决此问题的1/2
主键有点棘手,没有绝对的方法,但你可以做一些像我这样简单需要的东西。
当用户单击主页按钮或者某些内容中断您的应用程序时(例如来电),根据文档调用onUserLeaveHint,以便猜测您使用onUserInteraction方法标记最后一个用户交互时间。
现在,如果在onUserLeaveHint之前足够接近你可以假设(不保证但到目前为止对我有用)主页按钮是你的应用程序被推入后台的原因(退出)
不确定你在捕捉主页按钮的意图是什么,无论如何这里是一种简单的方法,我使用100ms围栏围绕这两个事件,我发现它一直对我有用。注意:我只测试了一些手机,就像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!");
}
答案 2 :(得分:9)
onUserLeaveHint是根据文档调用的 用户单击主页按钮或当某些内容中断您的 应用程序(如来电),以便猜出它是你 使用onUserInteraction方法标记最后一次用户交互 时间。
只是对Idistic给出的答案进行了一次小修正 - 当您的活动被来电中断时,OnUserLeaveHint()被不调用。以下是Android文档的片段 -
当活动即将到来时,被称为活动生命周期的一部分 作为用户选择的结果进入后台。例如,何时 用户按下Home键,将调用onUserLeaveHint(),但是 当来电通话导致通话活动时 自动带到前台,onUserLeaveHint()不会 呼吁活动被打断。
答案 3 :(得分:0)
是的,检查应用程序的生命周期 - 当用户最小化或留下几个方法被调用时 的onPause() 的onStop() 和onDestroy()
http://developer.android.com/reference/android/app/Activity.html
答案 4 :(得分:0)
在Application.ActivityLifecycleCallbacks
的帮助下,您可以跟踪正在破坏的活动和新的活动正在开始,但是当用户在最后一个堆栈上滑动或后退按钮时,postdelayed
将不会调用,并且{{1 }}和Activitystop
将始终在您位于应用程序内部时调用,如果您想捕获用户滑动或后退按钮(位于最后一个堆栈上),那么此代码将起作用。
destroy
答案 5 :(得分:-1)
您可能考虑的另一个选项是检查后退按钮或主页按键。这是通过覆盖onKeyDown(),监听后退键/ home键并覆盖默认行为来完成的。
我发现了一个类似的问题可能对你有所帮助。
Android: Prompt user to save changes when Back button is pressed
干杯