私はAndroidコーディングにかなり慣れていません。
一定時間後にデバイスの壁紙を継続的に変更するアプリを作成しました。壁紙は、SD カードのフォルダーから選択されます。私は Android/Java コーディングについてほとんど何も考えていないので、このアプリを開発するのに 2 か月かかりました。とにかく、これまでのところ、問題なく apk をビルドできます。アプリも正常に動作します。ただし、デバイスのメモリを大量に消費します。150MB以上のRAMのように!! これは良くなく、Androidもアプリを頻繁に殺します。
以下にコードを掲載しています。壁紙の変更は、以下のコードによって行われます。IntentService クラス。
誰かがこのコードを調べて、なぜそんなに多くのリソースを消費するのか、また、意図した目的でアプリをコーディングするための解決策を教えていただければ幸いです。
編集 1:メモリ消費量が多いのは、アプリが常にバックグラウンドで実行されていることが原因であることがわかりました。壁紙を設定したらアプリを強制終了し、遅延時間後に再度実行することはできますか?
public class ChangeWallpaper extends IntentService {
public static volatile boolean shouldContinue = true;
public File[] files_Chosen;
public ArrayList<String> File_String = new ArrayList<String>();
public ArrayList<String> File_Array = new ArrayList<String>();
public ChangeWallpaper() {
super(ChangeWallpaper.class.getName());
//setIntentRedelivery(true);
}
@Override
protected void onHandleIntent(Intent myintent) {
dostuff(myintent);
}
private void dostuff(Intent myintent) {
int hours_delay = myintent.getIntExtra("hours_delay", 0);
int minutes_delay = myintent.getIntExtra("minutes_delay", 1);
String m_chosen = myintent.getStringExtra("m_chosen");
File_Array = myinent.getStringArrayListExtra("File_String");
WallpaperManager myWallpaper = WallpaperManager.getInstance(getApplicationContext());
//Caution: Infinite loop
while (true) {
if (!shouldContinue) {
stopSelf();
return;
}
for (int i = 0; i < File_Array.size(); i++) {
Bitmap bitmap = BitmapFactory.decodeFile(File_Array.get(i));
try {
myWallpaper.setBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
try {
TimeUnit.HOURS.sleep(hours_delay);
TimeUnit.MINUTES.sleep(minutes_delay);
repeatStuff(m_chosen);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
repeatStuff(m_chosen);
}
}
public void repeatStuff(String m_chosen)
{
final String m_chosen1 = m_chosen;
SimpleFileDialog FolderChooseDialog = new SimpleFileDialog(ChangeWallpaper.this, "FolderChoose",
new SimpleFileDialog.SimpleFileDialogListener() {
@Override
public void onChosenDir(String m_chosen1) {
File pathVar = new File(m_chosen1);
FilenameFilter imageFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
String lowercaseName = name.toLowerCase();
if (lowercaseName.endsWith(".jpg") || lowercaseName.endsWith(".jpeg")
|| lowercaseName.endsWith(".png")
|| lowercaseName.endsWith(".gif")) {
return true;
} else {
return false;
}
}
};
File[] files = pathVar.listFiles(imageFilter);
if (files.length > 1) {
files_Chosen = files;
for (int i = 0; i < files.length; i++) {
File_String.add(files[i].toString());
}
File_Array = File_String;
}
}
});
}
}