2014-01-08 122 views
4

我正在開發將在Kiosk模式下運行的應用程序。在此應用程序中,如果用戶在5分鐘內沒有在應用程序中執行任何操作,則應用程序將顯示屏幕保護程序,該屏幕保護程序是應用程序的徽標。Android應用程序空閒時檢測

我的問題是,如何在5分鐘內檢測IDLE?

+0

http://stackoverflow.com/questions/4208730/how-to-detect-user-inactivity-in-android – NigelK

+0

嗨@NigelK,畫面不應該在空閒時關閉,讓我們說,15後秒。 – androidBoomer

+0

你好!屏幕會在這5分鐘內,當然是在6分鐘後保持開啓嗎?如果是這樣,這很容易! – iGio90

回答

4

我想你可以使用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

+0

Hi @Foxtur,你可以給我舉例說明如何使用dispatchTouchEvent()嗎? – androidBoomer

+1

@TwistedDroid 對不起,我以某種方式鏈接了視圖類而不是文檔的活動類 - 但現在應該修復。 我還添加了一個示例代碼 - 因爲我目前不在我的工作站,我無法自己測試代碼,我希望它可以工作。否則,當我回到安裝了Android SDK的計算機時,我會跟進編輯答案:) – Foxtur

1

嘗試:

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); 
} 
+0

startCount(time)將在觸摸事件之後觸發。即使徽標顯示,當用戶觸摸屏幕時,它也會回到最後一次發現閒置的活動。我應該使用哪些代碼? – androidBoomer

+0

startCount(time); < - 將此添加到您的ontouch/onclick。如果您希望用戶在屏幕被觸摸時返回到應用程序,您將需要一項服務! – iGio90

12

更好的解決方案這裏......非常簡單

我使用倒數計時器如波紋管,

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 ...... .... :)

+0

如何在應用退出此活動時取消倒計時?我在onFinish()中使用意圖,並​​在startActivity()時重新啓動計時器,或者如果單擊此活動中的某個按鈕,並將計時器仍然處於活動狀態,那麼此按鈕處於活動狀態。 – silversunhunter

+0

若要在活動退出時停止countdowntimer,則可以在onStop()....中調用countDownTimer.cancel()方法.... :) –

+0

好而簡單的方法,謝謝! – VAdaihiep

4

你應該試試這個,它會在檢測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); 
} 
+0

它工作完美。但如何將它應用於應用程序 –

+0

在函數中使用處理程序代碼並從任何你想要的地方調用它。 –