Android应用程序使用Timer定期更改壁纸

时间:2012-03-16 06:18:32

标签: android wallpaper

我希望创建一个应用程序,它会以固定的时间间隔更改Android设备的壁纸,比如每小时左右。目前在我的代码中,我启动了一个服务并使用了Timer对象。将定期调用Timer对象并更改壁纸。

这是我目前使用的代码。壁纸只改变一次而不是之后。请告诉我该怎么办?

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很新,有点困惑。

2 个答案:

答案 0 :(得分:7)

看起来你正在使用计时器错误。如果要重复它,则需要将初始延迟指定为第二个参数,将间隔指定为第三个参数。 Timer.schedule(timertask, initial delay, interval between recurrences);

注意:我在谈论您对myTimer.schedule(object, interval);

的来电

答案 1 :(得分:0)

尝试代替Timer班级ScheduledFuture 这有助于我解决计时器任务的所有问题 祝你好运!

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);
    }
    //...
}