当用户单击“ HOME”按钮android时显示PIN屏幕

问题描述

| 我有一个Android应用程序,该应用程序包含登录活动背后可供用户使用的几种活动。我要做的是,当用户单击HOME按钮(来自任何活动)然后显示返回应用程序时,显示PIN /登录活动。实际上,我想做的是单击HOME按钮时注销用户。 通过阅读其他文章,据我了解,无法使用键单击事件处理程序直接处理HOME按钮的单击。我尝试在活动中为CATEGORY_HOME意图添加意图过滤器:
@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事件中触发注销似乎是有问题的,因为当用户仅切换到应用程序中的其他活动时,它们将触发-在这种情况下,不应登录用户退出应用程序。 (此外,根据实验,onDestroy不会仅通过单击“ HOME”按钮来调用在这一点上,我感觉自己正在与Android体系结构进行斗争,因此我正在寻找一种替代方法。我已经考虑过尝试反转方法并使用onResume事件,但是我仍然不清楚如何知道某个给定的活动是否正在从应用程序中的另一个活动中恢复(无需PIN /登录)或由于用户再次调用该应用程序。 任何方法将不胜感激。     

解决方法

        您是否尝试将runOnUIThread()方法用于showHomeToast?问题可能出在从错误的线程烘烤。我可能看起来像:
runOnUiThread(new Runnable(){

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

        }

});
    ,        您可以尝试使用Application Class:它使您可以专注于应用程序的生命周期,而不是组件的生命周期(尽管从未使用过...) 此处http://developer.android.com/reference/android/app/Application.html     ,        进一步阅读之后,很显然不可能收到有关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对象是一个单独的单例,它确定用户是否长时间不活动。有关该模式的更多信息,请参见此帖子。] 然后,我所有的活动都扩展了一个公共的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();
    }
}
我仍然对是否还有其他人有一个不依赖于此“暂停和恢复之间的小间隔”的可靠解决方案感兴趣,但是现在这样做会很好。