0

Halo,我首先想知道我的 android 应用程序的空闲时间。在那之后,如果它是空闲时间模式,我会做一些事情。

我按照这个链接。 应用程序空闲时间

我的程序正常工作,但突然出现问题。我无法移动到其他页面(例如登录页面)或使用 alertdialog 弹出消息,因为它在线程中。你有什么解决办法?

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());

}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}}

这是我的 ControlApplication.java

public class ControlApplication extends Application {
private static final String TAG=ControlApplication.class.getName();
private Waiter waiter;
@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "Starting application"+this.toString());
    //setContentView(R.layout.activity_main);
    waiter=new Waiter(5*60*1000); //5 mins
    waiter.start();
    Toast.makeText(ControlApplication.this, "start", Toast.LENGTH_LONG).show();
}

public void touch()
{
    waiter.touch();
    Toast.makeText(ControlApplication.this, "touch", Toast.LENGTH_LONG).show();
}   }

这是 Waiter.java

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

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

@SuppressLint("ParserError")
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
            //Toast.makeText(activity, "Hello", Toast.LENGTH_LONG).show();
            stopCounter();
        }
    }
    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 stopCounter()
{
    stop=true;
}

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

我试图创建一个新类并调用一个方法来意图。它也失败了。试图从该方法弹出一条消息,它也失败了。

你们还有其他空闲时间的解决方案吗?谢谢。

问候, 阿尔弗雷德·安卡萨

4

2 回答 2

1

在你的活动中,而不是这个线程,做:

public class Graph extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                while(idle = 0) {
                    idle = System.currentTimeMillis()-lastUsed;

                    if(idle != period) {
                        Intent goNextActivity = new Intent(com.package.theactivity);
                    else {
                        idle == 0;
                    }
                }
             }
           }
于 2012-07-18T03:32:11.107 回答
1

我刚刚通过在谷歌上搜索找到了答案并尝试了 5 个小时.. :D

希望我的回答也能帮到你。

首先,我将 ControlApplication 和 Waiter 与 ControlActivity 混合在一起。这意味着我不需要这两个文件。我的 ControlActivity 将扩展活动(如果处于空闲模式,它对我的​​使用意图到另一个页面),我将实现可运行(它用于我运行线程)。

之后我有一个名为 onUserInteraction() 的方法,该方法帮助我在用户触摸或单击某物时获得用户交互。在 onCreate 中,我启动了所有变量,包括 lastUsed、period 和 stop。

我为什么要发起那个?因为您需要知道多少秒才能知道您的应用程序是否处于空闲模式。那是时期使用。停止变量用于我每 5 秒迭代和搜索一次(你也可以让它每秒检查一次是否空闲)我的应用程序是否空闲。我通过调用方法 touch 来启动 lastUsed。我将触摸方法从 ControlApplication 复制到我的 ControlActivity 中。通过调用 touch 方法,我可以知道我最后一次使用的时间。之后我开始我的线程。

在我的运行方法中,我设置空闲 = 0。并进行一些循环检查。我每 5 秒检查一次,以了解我的应用程序是否处于空闲模式。idle = System.System.currentTimeMillis()-lastUsed -> 我用它来知道空闲是否已经与周期匹配或不使用 if 方法。如果空闲时间大于期间,我的应用程序必须处于空闲模式。之后我停止迭代并使用处理程序来管理它。

我设置 handler.sendEmptyMessage(0),并创建 Handler。在处理程序中,我移至另一页。这是我的完整代码。

public class MainActivity extends Activity implements Runnable {
private static final String TAG= MainActivity.class.getName();
private long lastUsed;
private int period;
private boolean stop;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    period = 10000;
    stop=false;
    touch();
    Thread currentThread = new Thread(this);
    currentThread.start();
    Toast.makeText(getApplicationContext(), "Start", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

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

public synchronized void touch()
{
    lastUsed=System.currentTimeMillis();
    Toast.makeText(getApplicationContext(), "touch", Toast.LENGTH_SHORT).show();
}

public void moveIntent() {
    Intent intent = new Intent(this, AfterIdle.class);
    startActivity(intent);
}

public void validate(View view) {
    switch (view.getId()) {
        case R.id.button1 :
            Intent intent = new Intent(this, AfterIdle.class);
            startActivity(intent);
            break;
    }
}

@Override
public void run() {
    // TODO Auto-generated method stub
    long idle;

    while (!stop) {
        idle=System.currentTimeMillis()-lastUsed;
        try
        {
            Thread.sleep(5000); //check every 5 seconds
        }
        catch (InterruptedException e)
        {
            Log.d(TAG, "Waiter interrupted!");
        }
        if (idle > period) {
            idle = 0;
            stop = true;
        }
    }
    handler.sendEmptyMessage(0);
}

public Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        moveIntent();
    }
};}

我希望这段代码能帮助其他人,如果他们遇到我上次遇到的同样问题。如果我的答案是错误的,我希望有人能帮我纠正答案。谢谢。

问候, 阿尔弗雷德·安卡萨

于 2012-07-18T11:04:52.320 回答