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 に答える