Я использую Android WallpaperService
для реализации функции автоматического изменения обоев в моем приложении.Итак, после долгих исследований и пробных ошибок, я нашел решение, которое работает так, как я хотел.Но основная проблема с моей реализацией заключается в том, что она потребляет много энергии аккумулятора.Особенно, когда пользователь выбирает наименьший период времени (например, 5 минут).Мое приложение находится в топ-3 в списке самых высоких потребителей батареи.Итак, есть ли какой-нибудь альтернативный способ или улучшение в моем коде, которое значительно уменьшит потребление батареи?
Я публикую только часть кода, которая изменяет Bitmap of Canvas:
//Loading Bitmap from Storage, path is File variable
bitmap = BitmapFactory.decodeFile(path.getPath() + "/" + fileNames[index]);
canvas = holder.lockCanvas();
canvas.save();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
WindowManager windowManager =
(WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
//This part will get height and width of actual device screen(Resolution) if soft buttons are present
final Display display = windowManager.getDefaultDisplay();
Point outPoint = new Point();
if (Build.VERSION.SDK_INT >= 19) {
// include navigation bar
display.getRealSize(outPoint);
} else {
// exclude navigation bar
display.getSize(outPoint);
}
maxHeight = outPoint.y;
maxWidth = outPoint.x;
} else {
maxWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
maxHeight = Resources.getSystem().getDisplayMetrics().heightPixels;
}
if (width > height) {
//Crops Image to match the ratio of device resolution
// landscape
bitmap = Bitmap.createBitmap(
bitmap,
bitmap.getWidth() / 2 - bitmap.getHeight() / 2,
0,
bitmap.getHeight(),
bitmap.getHeight()
);
float widthratio = (float) bitmap.getHeight() / maxHeight;
width = (int) (bitmap.getWidth() / widthratio);
height = maxHeight;
} else if (height > width) {
// portrait
float ratio;
float heightratio = (float) width / maxWidth;
height = (int) (height / heightratio);
width = maxWidth;
if (height < maxHeight) {
ratio = (float) height / maxHeight;
height = maxHeight;
width = (int) (width / ratio);
}
} else {
// square
height = maxHeight;
width = maxWidth;
}
canvas.scale(1, 1);
//Scale the bitmap to match the resolution of device screen
bitmap = Bitmap.createScaledBitmap(bitmap, (int) (width), (int) (height), false);
//Drawing Image in Canvas
canvas.drawBitmap(bitmap, 0, 0, null);
bitmap.recycle();
bitmap = null;
canvas.restore();
holder.unlockCanvasAndPost(canvas);
handler.removeCallbacks(drawImage);
//Delaying handler as per user's preferenced time period
handler.postDelayed(drawImage, preferences.getInt("TIMETOCHANGEBACHGROUND", 3600) * 1000);
canvas.setBitmap(null);