应用空闲时间

Har*_*n R 21 android

在我的应用程序中有三个活动A - > B - > C - > A.我想检测应用程序的空闲时间,这样在15分钟后它会弹出一条消息而不考虑活动.实现这个的最佳方法是什么.

Bar*_*ica 63

我会这样做:

  1. 创建将控制空闲活动的线程
  2. 在Application环境中运行此线程
  3. 在每次用户交互时,只需刷新空闲时间

用于存储全局线程的类,用于控制空闲时间

public class ControlApplication extends Application
{
    private static final String TAG=ControlApplication.class.getName();
    private Waiter waiter;  //Thread which controls idle time

    // only lazy initializations here!
    @Override
    public void onCreate()
    {
        super.onCreate();
        Log.d(TAG, "Starting application"+this.toString());
        waiter=new Waiter(15*60*1000); //15 mins
        waiter.start();
    }

    public void touch()
    {
        waiter.touch();
    }
}
Run Code Online (Sandbox Code Playgroud)

将成为您所有活动的父级的班级

public class ControlActivity extends Activity
{
    private static final String TAG=ControlActivity.class.getName();

    /**
     * Gets reference to global Application
     * @return must always be type of ControlApplication! See AndroidManifest.xml
     */
    public ControlApplication getApp()
    {
        return (ControlApplication )this.getApplication();
    }

    @Override
    public void onUserInteraction()
    {
        super.onUserInteraction();
        getApp().touch();
        Log.d(TAG, "User interaction to "+this.toString());
    }

}
Run Code Online (Sandbox Code Playgroud)

最后是Thread本身

public class Waiter extends Thread
{
    private static final String TAG=Waiter.class.getName();
    private long lastUsed;
    private long period;
    private boolean stop;

    public Waiter(long period)
    {
        this.period=period;
        stop=false;
    }

    public void run()
    {
        long idle=0;
        this.touch();
        do
        {
            idle=System.currentTimeMillis()-lastUsed;
            Log.d(TAG, "Application is idle for "+idle +" ms");
            try
            {
                Thread.sleep(5000); //check every 5 seconds
            }
            catch (InterruptedException e)
            {
                Log.d(TAG, "Waiter interrupted!");
            }
            if(idle > period)
            {
                idle=0;
                //do something here - e.g. call popup or so
            }
        }
        while(!stop);
        Log.d(TAG, "Finishing Waiter thread");
    }

    public synchronized void touch()
    {
        lastUsed=System.currentTimeMillis();
    }

    public synchronized void forceInterrupt()
    {
        this.interrupt();
    }

    //soft stopping of thread
    public synchronized void stop()
    {
        stop=true;
    }

    public synchronized void setPeriod(long period)
    {
        this.period=period;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • onUserInteraction()更好:) (2认同)
  • 在清单文件中使用<application android:icon ="@ drawable/icon"android:label ="@ string/app_name"android:name =".ControlApplication"> (2认同)

Gre*_*lli 5

所以我个人会使用AlarmService.您可以指定将启动显示对话框的活动的PendingIntent.在应该重新启动计时器的任何事件之后,您只需取消pendingIntent并重新注册它.