SD カードでやるべき重い作業があるとします (CRC チェック、ダウンロード、または考えられることなら何でも)。結局のところ、ユーザーがアプリの実行中に SD カードをマウント (または削除) すると、アプリは OS によって警告なしに自動的に強制終了されます。
私はそれを避けたい、そして出たくない。代わりに、可能な場合は作業を停止して再開したいと思います(または、殺されないように他のことを行います)。
要するに、私の質問は、タイトルが示すとおりです。SDカードがマウントされているときに、SDカードの使用中にアプリが強制終了されないようにするにはどうすればよいですか?
私は次のことを試しました:
すべての例外をキャッチします。アプリは単純に強制終了されるため、これは機能しませんでした。
broadcastReceiver を介してマウントの意図をリッスンします。インテントをキャッチする前にアプリが強制終了されるため、機能しませんでした。
SDカードの状態を確認してください。チェックと書き込みの間にマウントができるため、これは機能しません。
SD カードに関連するすべてのことを処理する新しいサービスを作成し、独自のプロセスを提供できるかもしれませんが、それは本当に解決策ですか? それも機能しますか?この問題を克服する他の方法はありませんか?
サンプル コードとして、以下のコードを使用できます。それは問題を解決するためだけです:
public void createExternalStoragePrivateFile()
{
final File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
try
{
final InputStream is = getResources().openRawResource(R.drawable.ic_launcher);
final OutputStream os = new FileOutputStream(file);
final byte[] data = new byte[is.available()];
is.read(data);
for (int i = 0; i < data.length; ++i)
{
os.write(data[i]);
Log.d("DEBUG", "byte " + i + " out of " + (data.length + 1));
// try to mount during this loop and avoid crashing/being killed
Thread.sleep(100);
}
is.close();
os.close();
}
catch (final IOException e)
{
Log.w("DEBUG", "Error writing " + file, e);
}
catch (final InterruptedException e)
{
e.printStackTrace();
}
}
注: もちろん、私が開発したアプリは内部ストレージにインストールされます。SD カードにインストールされているアプリが強制終了されないというのは理にかなっていないことはわかっています。もちろん、それも興味深い質問になる可能性があります(SDカードのマウントを回避できる可能性さえありますか?)が、それはここでの質問ではありません。