假设我在 SD 卡上有繁重的工作(比如 CRC 检查、下载或任何你能想到的)。事实证明,如果用户在应用程序运行期间挂载 SD 卡(或移除它),应用程序将自动被操作系统杀死而不会发出任何警告。
我想避免它,而不是退出。相反,我想在可能的情况下停止工作并恢复(或做其他事情,只是不被杀死)。
所以,简而言之,我的问题正如标题所说:当安装 SD 卡时,如何避免我的应用程序在使用 sdcard 时被杀死?
我尝试了以下方法:
捕获所有异常。这不起作用,因为该应用程序被简单地杀死了。
通过广播接收器收听安装的意图。没有工作,因为应用程序在捕捉到意图之前就被杀死了。
检查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 卡?),但这不是这里的问题。