Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检测用户不活动并显示pincode屏幕_Android_Runnable_User Inactivity_Pin Code - Fatal编程技术网

Android 检测用户不活动并显示pincode屏幕

Android 检测用户不活动并显示pincode屏幕,android,runnable,user-inactivity,pin-code,Android,Runnable,User Inactivity,Pin Code,当用户处于非活动状态超过1分钟时,我需要显示Pincode屏幕 我发现这为我的需求提供了一个很好的解决方案,并在我的BaseActivity上实现了它 但是现在我的onUserInteraction()方法出现了问题,每次我按下按钮并启动新活动时,都会调用两次(并触发我的Runnable两次),因为当我在1分钟后返回上一个屏幕时,pincode屏幕会显示出来 我已将Runnable更改为静态,但我失去了启动pincode活动的上下文 如何从runnable启动活动,或确保只有在屏幕上点击某些内容

当用户处于非活动状态超过1分钟时,我需要显示Pincode屏幕

我发现这为我的需求提供了一个很好的解决方案,并在我的BaseActivity上实现了它

但是现在我的onUserInteraction()方法出现了问题,每次我按下按钮并启动新活动时,都会调用两次(并触发我的Runnable两次),因为当我在1分钟后返回上一个屏幕时,pincode屏幕会显示出来

我已将Runnable更改为静态,但我失去了启动pincode活动的上下文

如何从runnable启动活动,或确保只有在屏幕上点击某些内容时才会触发onUserInteraction()

我的当前代码:

  public class BaseActivity {
        private static final String TAG = BaseActivity.class.getSimpleName();

    static private Handler disconnectHandler = new Handler() {
        public void handleMessage(Message msg) {
        }
    };

    private Runnable disconnectCallback = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(BaseActivity.this, CustomPinActivity.class);
            startActivity(intent);
        }
    };

    public void resetDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
        disconnectHandler.postDelayed(disconnectCallback, getResources().getInteger(R.integer.disconnect_timeout));
    }

    public void stopDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
    }

    @Override
    public void onUserInteraction() {
        resetDisconnectTimer();
    }

    @Override
    protected void onResume() {
        super.onResume();
        resetDisconnectTimer();
    }

    @Override
    public void onStop() {
        super.onStop();
        stopDisconnectTimer();
    }
}
<activity
        android:name=".CustomPinActivity"
        android:launchMode="singleTop"
        android:label="@string/title_activity_pincode" />

<activity android:name=".base.BaseActivity"
        android:launchMode="singleTop" />
清单:

  public class BaseActivity {
        private static final String TAG = BaseActivity.class.getSimpleName();

    static private Handler disconnectHandler = new Handler() {
        public void handleMessage(Message msg) {
        }
    };

    private Runnable disconnectCallback = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(BaseActivity.this, CustomPinActivity.class);
            startActivity(intent);
        }
    };

    public void resetDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
        disconnectHandler.postDelayed(disconnectCallback, getResources().getInteger(R.integer.disconnect_timeout));
    }

    public void stopDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
    }

    @Override
    public void onUserInteraction() {
        resetDisconnectTimer();
    }

    @Override
    protected void onResume() {
        super.onResume();
        resetDisconnectTimer();
    }

    @Override
    public void onStop() {
        super.onStop();
        stopDisconnectTimer();
    }
}
<activity
        android:name=".CustomPinActivity"
        android:launchMode="singleTop"
        android:label="@string/title_activity_pincode" />

<activity android:name=".base.BaseActivity"
        android:launchMode="singleTop" />

好吧,我认为问题在于onUserInteraction()的方法。文件说:

对活动的onUserLeaveHint()回调的所有调用都将伴随对onUserInteraction()的调用

链接。onUserLeaveHint()的文档说明:

此回调和onUserInteraction()旨在帮助活动智能地管理状态栏通知;具体来说,帮助活动确定取消通知的适当时间

第二个环节

我知道,每次暂停活动时以及暂停之前都会调用onUserInteraction()方法。所以我会使用一个类似于:

    private boolean mStartingActivity;
    private Runnable disconnectCallback = new Runnable() {
            @Override
            public void run() {
                        mStartingActivity = true;
                        Intent intent = new Intent(BaseActivity.this, CustomPinActivity.class);
                        startActivity(intent);
                    }
                };

@Override 
public void onUserInteraction() {
                    if(!mStartingActivity)
                          resetDisconnectTimer();
                }

@Override
protected void onResume() {
                    super.onResume();
                    resetDisconnectTimer();
                    mStartingActivity = false;
                }

事实上,还有更优雅的解决方案。我希望它能有所帮助。

启动活动时,您应该使用flag\u ACTIVITY\u SINGLE\u TOP。我是。但是,当我通过单击按钮启动活动时,由于用户交互,我应该停止计时器。它确实有效,但仅适用于第一个onUserInteraction()。第二次又开始了。日志:
D/BaseActivity:onUserInteraction:reset timer resetDisconnectTimer D/BaseActivity:onUserInteraction:reset timer resetDisconnectTimer D/BaseActivity:onStop:.MainActivity stopDisconnectTimer
我建议您发布启动BaseActivity的意图或其清单,检查您是否使用了single_top选项。总之,一般来说,我使用onPause()方法作为onResume()方法的反面。谢谢,@NoMoreHelloWorld。我用清单片段编辑了我的文章。使用onPause-ou-onStop并没有阻止它运行两次。问题就在这之前。用户交互在onPause之前被调用了两次,我认为它就是线程被复制的地方。看起来CustomPinActivity扩展了BaseActivity,两个实例都接收到对onUserInteraction的调用,所以它们都调用postDelayed。两个类都使用自己的Runnable类实例,因此对象不同,因此一个类的removeCallback不会删除另一个类的回调,如果使用了它,只会删除其Runnable实例的回调。