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

jav*_*nes 27 android

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

此外,一个类似的事件onInit()在我的场景中会很有用,因为我只想让MyIn?t操作从一开始就开始.

onDestroy() 在其他应用需要更多内存之前不会被调用.

小智 27

注意:仅当您的目标是> = 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) {

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Runnable不会在活动生命周期的上下文中运行,因此要在活动中使用它,您需要设置和检查某些应用程序范围的标志或广播意图.


Idi*_*tic 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!");  
}
Run Code Online (Sandbox Code Playgroud)

  • 当来电将活动推送到后台时,`onUserLeaveHint()`不会被调用(至少在某些系统上).事实上,通过电话,您可以按HOME并转到任何应用程序,并且仍然不会调用`onUserLeaveHint()`. (5认同)
  • @ Sreedevi的答案(http://stackoverflow.com/a/7793412/383414)中提到的文档来自Android文档`Activity.onUserLeaveHint()`(http://developer.android.com/reference/android /app/Activity.html#onUserLeaveHint()).该方法的设计使得在电话呼入进入时不会调用它.(碎片...让我们的Android开发人员继续工作.) (5认同)
  • @Richard Le Mesurier我不怀疑它在某些系统上的工作方式不同,但如果这是真的,那就是一个缺陷.欢迎来到Android碎片的精彩世界;-) (2认同)
  • 即使应用程序因为从通知栏启动应用程序而进入后台,也总是说Home Key Pressed.在任何情况下都无法获得第二条消息. (2认同)

Sre*_*i J 9

当用户单击主页按钮或某些内容中断您的应用程序时(例如来电),根据文档调用onUserLeaveHint,以便猜测您使用onUserInteraction方法标记最后一个用户交互时间.

只是对Idistic给出的答案进行了一次小修正 - 当您的活动被来电中断时,不会调用OnUserLeaveHint().以下是Android文档的片段 -

当活动即将作为用户选择的结果进入后台时,被称为活动生命周期的一部分.例如,当用户按下Home键时,将调用onUserLeaveHint(),但是当传入的电话呼叫导致调用中的Activity自动被带到前台时,onUserLeaveHint()将不会被调用的活动被调用.