如何检测用户是否已离开我的应用程序?

时间:2011-07-13 17:08:47

标签: android

我正在开发一个Android应用程序,我想通过单击“返回”按钮或“主页”按钮来检测用户何时退出我的应用程序。

此外,像onInit()这样的事件在我的方案中会很有用,因为我只想先启动MyInıt操作。

在其他应用需要更多内存之前,不会调用

onDestroy()

6 个答案:

答案 0 :(得分:26)

注意:仅当您的目标是> = API14

时才有效

您还可以使用 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

干杯