[解決済み] Androidでユーザーの非アクティブを検出する方法
2022-05-17 13:40:30
質問
ユーザーが私のアプリを起動し、ログインしています。
セッションタイムアウトを5分に選択します。
アプリに対していくつかの操作を行います。(すべてフォアグラウンドで)
今度はユーザーがMyappをバックグラウンドにし、他のアプリを起動する。
----> カウントダウンタイマーを開始し、5分後にユーザーをログアウトさせる。
またはユーザーが画面を消した
----> カウントダウンタイマーを開始し、5分後にユーザーをログアウトさせる。
アプリがフォアグラウンドにありながら、ユーザーが長時間(6~7分)アプリを操作しない場合でも、同じ動作をさせたいのです。画面は常にオンになっていると仮定します。私は一種の検出をしたい ユーザーの非アクティブ (アプリがフォアグラウンドにあるにもかかわらず、アプリとのインタラクションがない)を検出し、カウントダウンタイマーを起動させたい。
どのように解決するのですか?
public class MyApplication extends Application {
private int lastInteractionTime;
private Boolean isScreenOff = false;
public void onCreate() {
super.onCreate();
// ......
startUserInactivityDetectThread(); // start the thread to detect inactivity
new ScreenReceiver(); // creating receive SCREEN_OFF and SCREEN_ON broadcast msgs from the device.
}
public void startUserInactivityDetectThread() {
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
Thread.sleep(15000); // checks every 15sec for inactivity
if(isScreenOff || getLastInteractionTime()> 120000 || !isInForeGrnd)
{
//...... means USER has been INACTIVE over a period of
// and you do your stuff like log the user out
}
}
}
}).start();
}
public long getLastInteractionTime() {
return lastInteractionTime;
}
public void setLastInteractionTime(int lastInteractionTime) {
this.lastInteractionTime = lastInteractionTime;
}
private class ScreenReceiver extends BroadcastReceiver {
protected ScreenReceiver() {
// register receiver that handles screen on and screen off logic
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(this, filter);
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
isScreenOff = true;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
isScreenOff = false;
}
}
}
}
isInForeGrnd ===>のロジックは質問の範囲外なので、ここでは表示しません。
以下のデバイスコードを使用することで、CPUへのロックを解除することができます。
if(isScreenOff || getLastInteractionTime()> 120000 || !isInForeGrnd)
{
//...... means USER has been INACTIVE over a period of
// and you do your stuff like log the user out
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
Log.e("screen on.................................", "" + isScreenOn);
if (isScreenOn == false) {
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "MyLock");
wl.acquire(10000);
PowerManager.WakeLock wl_cpu = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyCpuLock");
wl_cpu.acquire(10000);
}
}
関連
-
[解決済み] Android 8.0: java.lang.IllegalStateException: Not allowed to start service Intent
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Androidでユーザーの非アクティブを検出する方法
-
[解決済み] Android Studio - Lollipop, ADB, & Genymotionの問題。デバイスが表示されない "adb server is out of date... 殺し合い..." 重複] [重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】このHandlerクラスはstaticでなければリークが発生する可能性があります。IncomingHandler
-
[解決済み] アンドロイド アクティビティスタックを消去する
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Uri.getPath()で実パスを取得する。
-
[解決済み] 純正CPU使用率データの読み方
-
[解決済み] Androidで他のアクティビティを呼び出すときにアニメーションを表示させるには?
-
[解決済み] DialogFragment の setCancelable プロパティが機能しない
-
[解決済み] Androidアプリケーションのインストール中に「Parse Error: Androidアプリケーションのインストール時に「パッケージの解析に問題があります。
-
[解決済み] Android端末のシリアルナンバーを調べるには?
-
[解決済み] Android Studioがアプリに変更をデプロイしない