首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测Android中的用户不活动

如何检测Android中的用户不活动
EN

Stack Overflow用户
提问于 2010-11-18 04:13:14
回答 16查看 95.1K关注 0票数 112

用户启动我的应用程序并登录。

选择会话超时为5分钟。

在应用程序上执行一些操作。(全部在前台)

现在,用户将Myapp带到后台并启动其他一些应用程序。

->倒计时计时器启动并在5分钟后注销用户

或者用户关闭屏幕。

->倒计时计时器启动并在5分钟后注销用户

我想要相同的行为,即使应用程序在前台,但用户在很长一段时间内没有与应用程序交互,比如6-7分钟。假设屏幕一直处于打开状态。我想要检测用户的不活动(即使应用程序在前台,也不能与应用程序交互),并启动我的倒计时器。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2010-11-18 08:15:59

代码语言:javascript
运行
复制
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的锁定-

代码语言:javascript
运行
复制
  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);
      }
    }
票数 11
EN

Stack Overflow用户

发布于 2012-09-19 01:18:05

我根据Fredrik Wallenius的回答提出了一个非常简单的解决方案。这是一个需要由所有活动扩展的基本活动类。

代码语言:javascript
运行
复制
public class MyBaseActivity extends Activity {

    public static final long DISCONNECT_TIMEOUT = 300000; // 5 min = 5 * 60 * 1000 ms


    private static Handler disconnectHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            // todo
            return true;
        }
    });

    private static Runnable disconnectCallback = new Runnable() {
        @Override
        public void run() {
            // Perform any required operation on disconnect
        }
    };

    public void resetDisconnectTimer(){
        disconnectHandler.removeCallbacks(disconnectCallback);
        disconnectHandler.postDelayed(disconnectCallback, DISCONNECT_TIMEOUT);
    }

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

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

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

    @Override
    public void onStop() {
        super.onStop();
        stopDisconnectTimer();
    }
}
票数 118
EN

Stack Overflow用户

发布于 2010-11-18 07:11:03

我不知道跟踪不活动的方法,但有一种方法可以跟踪用户的活动。您可以在您的活动中捕获一个名为onUserInteraction()的回调,每次用户与应用程序进行任何交互时都会调用该回调。我建议这样做:

代码语言:javascript
运行
复制
@Override
public void onUserInteraction(){
    MyTimerClass.getInstance().resetTimer();
}

如果您的应用程序包含多个活动,为什么不将此方法放在一个抽象超类中(扩展Activity),然后让所有活动都对其进行扩展。

票数 99
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4208730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档