RSS

Serviceにタイマーを途中から追加すると動かない?

前回に続き、Androidのテストアプリ作成中。
。。。なんですが、なんか上手くいかない。

とりあえず、今困っているのはServiceにタイマーをセットしても、
定期的にタスクを実行してくれないこと。

下の【作っているコード】みたいに、Activityから呼び出しを行ったタイミングで
タイマーを生成しても動かないっぽい。

他のサイトを見てみると、下記2点のようになっていた。
1.タイマーをサービス生成(onCreate)時に生成する。
2.タイマー生成時に、定期的に、登録されたCallbackを実行するタスクをするよう設定

1、2共にユーザが使わないのに無駄に処理を行う必要はないだろうなぁ、
と思ってあえて省いていた部分。
なんだけど、実はAndroid的には重要だったりするのかな?
生成時にタイマーを保持していないServiceは
監視対象から外されて後からタイマーを追加してもタイマーが動作しない、とか。
それとも、デーモンタイマーにしてしまっているのがまずいのかなぁ。
はてさて。

次試すときに確認してみよう。

■作っているコード



/**
 * 定期通知用のサービスクラス
 *
 * @author フクシ―
 */
public class TimerService extends Service
{
・・・略
    /** 定期通知用のタイマ */
    private Timer timer_;
・・・略   
    /**
     * ITimerServiceの実装.
     */
    private ITimerService.Stub timerServiceIf_ = new ITimerService.Stub(){
       
        /**
         * {@inheritDoc}
         */
        @Override
        public void registerRepeatTask(long delay, long period, ITimerAlarmServiceCallback callback)
                throws RemoteException {
           
            final ITimerServiceCallback targerCallback = callback;
            TimerService.this.timer_ = new Timer(true);
           
            TimerTask timerTask = new TimerTask() {
                public void run()
                {
                    try
                    {
                        Toast toast = Toast.makeText(getApplicationContext(), "Count Start",
                                Toast.LENGTH_SHORT);
                        toast.show();
                        targerCallback.updateTimerText();
                    }
                    catch (RemoteException e)
                    {
                        e.printStackTrace();
                        Toast toast = Toast.makeText(getApplicationContext(), "Count Failed",
                                Toast.LENGTH_SHORT);
                        toast.show();
                    }
                }
            };
           
            TimerAlarmService.this.timer_.schedule(timerTask,delay,period);
           
            Toast toast = Toast.makeText(getApplicationContext(), "Timer Started",
                    Toast.LENGTH_SHORT);
            toast.show();
        }
・・・略
}

0 コメント:

コメントを投稿