我正在開發將在Kiosk模式下運行的應用程序。在此應用程序中,如果用戶在5分鐘內沒有在應用程序中執行任何操作,則應用程序將顯示屏幕保護程序,該屏幕保護程序是應用程序的徽標。Android應用程序空閒時檢測
我的問題是,如何在5分鐘內檢測IDLE?
我正在開發將在Kiosk模式下運行的應用程序。在此應用程序中,如果用戶在5分鐘內沒有在應用程序中執行任何操作,則應用程序將顯示屏幕保護程序,該屏幕保護程序是應用程序的徽標。Android應用程序空閒時檢測
我的問題是,如何在5分鐘內檢測IDLE?
我想你可以使用http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(android.view.MotionEvent)和http://developer.android.com/reference/android/app/Activity.html#dispatchKeyEvent(android.view.KeyEvent)在您的應用程序設置一個時間戳每次一個用戶交互發生(簡單覆蓋的方法,並在年底返回false,這樣的事件將被傳播到下面的意見) - 那麼你可以使用某種計時器來檢查交互的最後一次時間戳,並在達到5分鐘IDLE時間時觸發屏幕保護程序。
所以在活動中,您只需覆蓋這樣之前提到的方法:
@Override
public boolean dispatchTouchEvent (MotionEvent ev) {
timestamp = System.getCurrentTimeMilis();
return false; // return false to indicate that the event hasn't been handled yet
}
的dispatchKeyEvent,哪些是你可以重寫,以確定用戶活動的其他方法應該工作非常相似。
如果您使用多個Activity,您可能需要創建一個擴展Activity的基類,並覆蓋您想要處理的所有dispatchXXXEvent以及您用作所有Activities的基類的基類。不過,我想你的實現細節可能會有點超出範圍的實際問題:)
對於定時器的不同可能性,你會發現這裏有用的信息:Scheduling recurring task in Android
Hi @Foxtur,你可以給我舉例說明如何使用dispatchTouchEvent()嗎? – androidBoomer
@TwistedDroid 對不起,我以某種方式鏈接了視圖類而不是文檔的活動類 - 但現在應該修復。 我還添加了一個示例代碼 - 因爲我目前不在我的工作站,我無法自己測試代碼,我希望它可以工作。否則,當我回到安裝了Android SDK的計算機時,我會跟進編輯答案:) – Foxtur
嘗試:
private void startCount(int time) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Add here the code for showing the fullscreenlogo
}
}, time);
}
那麼,當你要開始計數,你應該加上:
startCount(time); // Replace time with 60*5*1000 for 5 mins
,如果你想開始計數,當應用程序最小化了d,然後使用此:
@Override
public void onPause() {
super.onPause();
startCount(time);
}
startCount(time)將在觸摸事件之後觸發。即使徽標顯示,當用戶觸摸屏幕時,它也會回到最後一次發現閒置的活動。我應該使用哪些代碼? – androidBoomer
startCount(time); < - 將此添加到您的ontouch/onclick。如果您希望用戶在屏幕被觸摸時返回到應用程序,您將需要一項服務! – iGio90
更好的解決方案這裏......非常簡單
我使用倒數計時器如波紋管,
private long startTime=15*60*1000; // 15 MINS IDLE TIME
private final long interval = 1 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countDownTimer = new MyCountDownTimer(startTime, interval);
}
@Override
public void onUserInteraction(){
super.onUserInteraction();
//Reset the timer on user interaction...
countDownTimer.cancel();
countDownTimer.start();
}
public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
//DO WHATEVER YOU WANT HERE
}
@Override
public void onTick(long millisUntilFinished) {
}
}
CHEERS ...... .... :)
如何在應用退出此活動時取消倒計時?我在onFinish()中使用意圖,並在startActivity()時重新啓動計時器,或者如果單擊此活動中的某個按鈕,並將計時器仍然處於活動狀態,那麼此按鈕處於活動狀態。 – silversunhunter
若要在活動退出時停止countdowntimer,則可以在onStop()....中調用countDownTimer.cancel()方法.... :) –
好而簡單的方法,謝謝! – VAdaihiep
你應該試試這個,它會在檢測IDLE 5分鐘時通知吐司。
Handler handler;
Runnable r;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "user Is Idle from last 5 minutes",
Toast.LENGTH_SHORT).show();
}
};
startHandler();
}
@Override
public void onUserInteraction() {
// TODO Auto-generated method stub
super.onUserInteraction();
stopHandler();//stop first and then start
startHandler();
}
public void stopHandler() {
handler.removeCallbacks(r);
}
public void startHandler() {
handler.postDelayed(r, 5*60*1000);
}
它工作完美。但如何將它應用於應用程序 –
在函數中使用處理程序代碼並從任何你想要的地方調用它。 –
http://stackoverflow.com/questions/4208730/how-to-detect-user-inactivity-in-android – NigelK
嗨@NigelK,畫面不應該在空閒時關閉,讓我們說,15後秒。 – androidBoomer
你好!屏幕會在這5分鐘內,當然是在6分鐘後保持開啓嗎?如果是這樣,這很容易! – iGio90