0

サービスを開始するアクティビティ(StartActivityと呼ばれる)があります。サービスは、MainActivityクラスのメソッドを呼び出します。このプロセスは、Serviceクラス内にあるタイマーで繰り返されることになっています。プログラムは1回の実行後に停止しますが、スケジュールが変更されていないようです。アクティビティが最初にクリックされたときにプログラムが機能するため、アクティビティの開始時にonStartコマンドがサービスに与えられることを知っています。どちらのタスクも再度実行されません。どんなアドバイスでも大歓迎です。TLDR:タイマーがメソッドを繰り返し呼び出していません。初めて動作します。

サービスクラス

import java.util.TimerTask;
import java.util.Calendar;
import java.util.Timer;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class SvcActivity extends Service {

    TimerTask questionTask;
    TimerTask gpsTask;
    Handler handler = new Handler();
    Timer t = new Timer();

    @Override
    public int onStartCommand(Intent i,int flags,int startID) {
        Log.i("AAA","---In service---");
        questionTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        if(getHour()>=10&&getHour()<=22)
                        {
                            Intent i=new Intent(SvcActivity.this,MainActivity.class);
                            i.putExtra("key", "setup");
                            i.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            Log.i("AAA","---right before startActivity---");
                            startActivity(i);
                        }
                        else
                            Log.i("AAA","---not between 10am and 10pm. Correct!");
                    }
                });
            }
        };

        gpsTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        Log.i("AAA","---in async task");
                        if(MainActivity.con!=null)
                        {
                        Log.i("AAA","---about to call async task");
                        BackgroundActivity objAsyncTask = new BackgroundActivity();            
                        objAsyncTask.execute();
                        }
                    }
                });
            }
        };

        int q=(int)(Math.random() * 2);
        if(q<1)
        {
        // first run, subsequent time delay. in miliseconds
            t.schedule(questionTask, 300, (3600000+2700000)); // 1 hour 45 min  
        }
        else
            t.schedule(questionTask, 300, (7200000+900000)); // 2 hour 15 min   

        t.schedule(gpsTask, 300, 300000);// 5 min

        return START_STICKY;
    }

    //-----------------------------get hour------------------------------------------
    public int getHour()
    {
        Calendar c=Calendar.getInstance();
        int hour=c.get(Calendar.HOUR_OF_DAY);
        return hour;
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }


}
4

1 に答える 1

0

問題は、アクティビティが強制終了されていたことです。再起動していても、タイミングがめちゃくちゃでした。私の最終的な解決策は、AlarmManagerを使用して、強制終了されたアクティビティの影響を受けない繰り返しアラームを設定することでした。次に、BroadcastReceiverでこれをキャッチし、そこからコードを実行しました。

于 2012-12-19T19:31:37.527 に答える