【问题标题】:Android app to change wallpaper at regular intervals using TimerAndroid应用程序使用定时器定期更换壁纸
【发布时间】:2012-03-16 06:18:31
【问题描述】:

我希望创建一个应用程序,它会以固定的时间间隔(例如每小时左右)更改 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很陌生,有点困惑。

【问题讨论】:

    标签: android wallpaper


    【解决方案1】:

    您似乎错误地使用了计时器。如果你想让它重复,你需要指定一个初始延迟作为第二个参数,一个间隔作为第三个参数。 Timer.schedule(timertask, initial delay, interval between recurrences);

    注意:我说的是你给myTimer.schedule(object, interval);的电话

    【讨论】:

    • 设置 0 为延迟立即开始。 :)
    • 谢谢..这似乎现在可以工作了.. 还有一些其他 myTimer.schedule() 方法只有两个参数,所以这并没有给我一个错误。无论如何,我很高兴我不必使用 Handler 等。
    • 是的!仅使用两个参数可以生成一次性计时器。有时有用!
    • 但是,我发现当设备处于睡眠模式时,服务会停止。因此,我最终将不得不使用 AlarmManager
    【解决方案2】:

    尝试代替Timer class 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);
        }
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多