Фоновая служба работает, но не работает должным образом в устройствах kitkat
Что я имею
Фоновая служба, автоматически изменяющая обои устройства из нескольких выбранных изображений. Он отлично работает на устройствах с lolipop и post lolipop. Но проблема возникает, когда я пробую это на устройстве kitkat. Сервис остается живым, но не работает, так как я не вижу смены обоев.
Как я узнаю, что сервис жив?
На устройстве kitkat, когда я захожу в Настройки-> Приложения-> Запуск. Он показывает 1 сервис, запущенный для моего приложения, и, поскольку это единственный сервис, который я реализовал во всем приложении, я уверен, что сервис работает. Более того, greenify показывает, что сервис все еще работает.
Что должен делать сервис
Пользователи могут загружать изображения, которые хранятся в определенной папке. Когда пользователь устанавливает интервал, после которого обои должны меняться, и нажимает кнопку, чтобы запустить их, запускается фоновая служба, которая выводит растровое изображение из ранее загруженных изображений и устанавливает их в качестве обоев по истечении заданных интервалов.
Декларация манифеста для сервиса
<service android:name=".AutomaticWallpaperChanger" android:enabled="true" android:exported="false"/>
Код для услуги:
public class AutomaticWallpaperChanger extends Service {
// constant
public static long NOTIFY_INTERVAL;
Boolean shuffle;
int wallpaper;
SharedPreferences mySharedPreferences;
SharedPreferences.Editor editor;
// run on another Thread to avoid crash
private Handler mHandler = new Handler();
// timer handling
private Timer mTimer = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("onstart gallery dialog","called");
editor.putBoolean("service not running",false).commit();
return START_STICKY;
}
@Override
public void onCreate() {
// cancel if already existed
if (mTimer != null) {
mTimer.cancel();
} else {
// recreate new
mTimer = new Timer();
}
mySharedPreferences = getApplicationContext().getSharedPreferences("preferences", Activity.MODE_PRIVATE);
editor= mySharedPreferences.edit();
AutomaticWallpaperChanger.NOTIFY_INTERVAL=mySharedPreferences.getInt("interval",3600);//3600*1000)*1000;
AutomaticWallpaperChanger.NOTIFY_INTERVAL*=1000;
// schedule task
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}
class TimeDisplayTimerTask extends TimerTask {
@Override
public void run() {
Log.d("timer","Running");
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
//Toast.makeText(getApplicationContext(),
//"running",
// Toast.LENGTH_SHORT).show();
// display toast
AsyncTask asyncTask= new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
File folder = new File(Environment.getExternalStorageDirectory() + File.separator + "WallR"+ File.separator + "Gallery");
if(folder.exists()) {
File[] listOfFiles = folder.listFiles();
shuffle = mySharedPreferences.getBoolean("checked", false);
Log.d("shuffle", String.valueOf(shuffle));
if (shuffle != true) {
if (listOfFiles.length != 0) {
wallpaper = mySharedPreferences.getInt("wallpaper", 0);
wallpaper++;
editor.putInt("wallpaper", wallpaper);
editor.commit();
if (wallpaper >= listOfFiles.length) {
wallpaper = 0;
editor.putInt("wallpaper", wallpaper);
editor.commit();
}
Log.d("wallpaperr number", String.valueOf(wallpaper));
Bitmap bitmap = BitmapFactory.decodeFile(listOfFiles[wallpaper].getPath());
WallpaperManager mWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
try {
mWallpaperManager.setBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
bitmap.recycle();
}
}
else {
if (listOfFiles.length != 0) {
wallpaper = mySharedPreferences.getInt("wallpaper", 0);
wallpaper++;
editor.putInt("wallpaper", wallpaper);
editor.commit();
if (wallpaper >= listOfFiles.length) {
wallpaper = 0;
editor.putInt("wallpaper", wallpaper);
editor.commit();
}
shuffleArray(listOfFiles);
Log.d("wallpaperr number", String.valueOf(wallpaper));
Bitmap bitmap = BitmapFactory.decodeFile(listOfFiles[wallpaper].getPath());
WallpaperManager mWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
try {
mWallpaperManager.setBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
bitmap.recycle();
}
}
}
return null;
}
};
asyncTask.execute();
}
});
}
void shuffleArray(File[] ar)
{
// If running on Java 6 or older, use `new Random()` on RHS here
Random rnd = new Random();
for (int i = ar.length - 1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
File a = ar[index];
ar[index] = ar[i];
ar[i] = a;
}
}
}
@Override
public void onDestroy() {
editor.putBoolean("service not running", true).commit();
mTimer.cancel();
mTimer.purge();
}
}
Мои наблюдения
Служба отлично работает для устройств на основе леденцов, зефира и нуги. Но для устройств kitkat он работает до тех пор, пока приложение открыто. После того, как я удаляю приложение из последних приложений, сервис остается активным, но больше не меняет обои.