2012-03-16 38 views
5

我想創建一個應用程序,它會以固定的時間間隔更改Android設備的壁紙,每隔一小時左右說一次。目前在我的代碼中,我啓動了一個服務並使用了一個Timer對象。 Timer對象會定期調用並更改壁紙。Android應用程序定期更換壁紙使用定時器

這是我目前使用的代碼。壁紙只能更改一次,而不是之後。請讓我知道我該怎麼辦?

public class Wallpaper extends Service { 

    Timer mytimer; 
    int interval=60000; 
    Drawable drawable; 
    WallpaperManager wpm; 
    int prev=1; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mytimer=new Timer(); 
     wpm=WallpaperManager.getInstance(Wallpaper.this); 
    } 



    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mytimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 

       if(prev==1){ 
        drawable = getResources().getDrawable(R.drawable.two); 
        prev=2; 
       } 
       else if(prev==2){ 
        drawable = getResources().getDrawable(R.drawable.three); 
        prev=3; 
       } 
       else{ 
        drawable = getResources().getDrawable(R.drawable.one); 
        prev=1; 
       } 


       Bitmap wallpaper=((BitmapDrawable)drawable).getBitmap(); 

       try { 
        wpm.setBitmap(wallpaper); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     }, interval); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 

另外,我需要使用AlarmManager或Handler來實現嗎?我對Android很陌生,有點困惑。

回答

7

它看起來像你使用計時器錯誤。如果你想讓它重複出現,你需要指定一個初始延遲作爲第二個參數,並且間隔作爲第三個參數。 Timer.schedule(timertask, initial delay, interval between recurrences);

注意:我說的是你的電話到myTimer.schedule(object, interval);

+1

設置0爲延遲立即開始。 :) – Calvin 2012-03-16 06:27:05

+0

Thanks..this似乎現在正在工作..還有一些其他myTimer.schedule()方法只有兩個參數,所以這並沒有給我一個錯誤。無論如何,我很高興我不必使用Handler等。 – ambit 2012-03-16 06:50:53

+0

是!只使用兩個參數可以生成一次性定時器。有時很有用! – 2012-03-16 07:36:24

0

嘗試TimerScheduledFuture
這幫助我,而不是解決所有問題,計時器任務
祝你好運!

private ScheduledFuture mytimer; 

//... 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); 
    mytimer = timer.scheduleWithFixedDelay(new TimerTask() { 
     @Override 
     public void run() { 
      //... 
     } 
    }, 0, interval, TimeUnit.MILLISECONDS); 
    return super.onStartCommand(intent, flags, startId); 
} 

//... 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mytimer != null) { 
     mytimer.cancel(true); 
    } 
    //... 
}