当用户点击HOME按钮android时显示PIN屏幕

时间:2011-06-14 14:12:04

标签: android

我有一个Android应用程序,它包含一些可供登录活动后面的用户使用的活动。我想要做的是当用户点击HOME按钮(来自任何活动)然后返回应用程序时显示PIN /登录活动。实际上,我想要做的是在单击HOME按钮时注销用户。

通过阅读其他帖子,我的理解是没有办法直接使用按键点击事件处理程序来处理HOME按钮。我尝试在活动中为CATEGORY_HOME意图添加一个intent过滤器:

@Override
public void onCreate( Bundle savedInstanceState ) {
    IntentFilter homeIntentFilter = new IntentFilter();
    homeIntentFilter.addCategory( Intent.CATEGORY_HOME );
    BroadcastReceiver homeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive( Context context, Intent intent ) {
            showHomeToast();
       }
};
    registerReceiver( homeReceiver, homeIntentFilter);
}

public void showHomeToast() {
    Toast homeToast = Toast.makeText( this, "home clicked", Toast.LENGTH_LONG );
    homeToast.show();
}

但这似乎没有发生。

此外,由于应用程序中有许多活动,因此在onPause或onStop事件中触发注销似乎有问题,因为当用户只是切换到应用程序中的其他活动时它们会触发 - 在这种情况下,用户应该不要退出应用程序。 (另外,从实验中,只需点击东西HOME按钮就不会调用onDestroy)

此时,我觉得我正在与Android架构作斗争,所以我正在寻找另一种方法。我已经考虑过试图反转我的方法并使用onResume事件,但我又不知道如何知道某个特定活动是从应用程序中的另一个活动恢复(不需要PIN /登录),还是因为用户已经调用申请再次。

任何方法都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

您是否尝试过showOomeToast的runOnUIThread()方法?可能问题在于它是从错误的线程中烘烤。我可能看起来像:

runOnUiThread(new Runnable(){

        @Override
        public void run() {
            showHomeToast();

        }

});

答案 1 :(得分:0)

您可以尝试使用应用程序类:它可以让您专注于应用程序的生命周期而不是它的组件(从未使用过它......) 这里http://developer.android.com/reference/android/app/Application.html

答案 2 :(得分:0)

在进一步阅读之后,显然无法接收Intent.CATEGORY_HOME意图的通知,没有为设备创建自定义主页,这不是问题。

为了提供理想的行为,我最终做了一些比我希望的更糟糕的事情 - 但这是一个合理的方法,它一直在工作。该方法的摘要是让每个活动更新单个时间戳onPause,然后在每个活动的onResume中,检查自设置暂停以来的时间长度 - 如果差异大于某个小的数量,则意味着活动正在从应用程序以外的某个地方恢复,应显示PIN屏幕。 Application类的自定义扩展提供了一种简单的机制来管理时间戳单例和集中检查代码。这是代码:

public class MyApplication extends Application {

private long mLastPause;

public long getLastPause() {
    return mLastPause;
}

public void setLastPause() {
    mLastPause = new Date().getTime();
}

public boolean isAppResuming() {
    long now = new Date().getTime();
    long millisecondsSinceLastPause = now - getLastPause(); 
    return millisecondsSinceLastPause > 2000;
}

public Intent onResume() {
    if ( shouldShowPINEntry() == true ) {
        return new Intent( this, PINEnterActivity.class );
    }
    return null;
}

public boolean shouldShowPINEntry() {

    if ( isAppResuming() == true || Session.isActive( this ) == false ) {
        return true;
    }
    else {
        Session.extend();
    }

    return false;
}
}

[上面代码中的Session对象是一个单独的单例,用于确定用户是否长时间处于非活动状态。有关该模式的更多信息,请参阅this post。]

然后,我的所有活动都扩展了一个常见的SecureActivity,它与MyApplication交互,如下所示:

public class SecureActivity extends Activity {
    @Override
    protected void onResume() {
        Intent resumeIntent = ( (MyApplication) this.getApplicationContext() ).onResume();
        if ( resumeIntent != null ) {
                startActivity( resumeIntent );
        }
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        ( (MyApplication) this.getApplicationContext() ).setLastPause();
    }
}

如果其他人有一个不依赖于“暂停和恢复之间的小间隔”的可靠解决方案,我仍然感兴趣,但现在这样做会很好。