在看到ianhanniballake的评论之后,这个问题被编辑了。我删除了不相关的部分。
我有一个由AlarmManager重复调用的intent服务,并且读取一些文件(文件内容很少更改)以提取PublicKey对象。
存储文件(定期访问)的最佳位置是什么?什么是最快的记忆? 我想这是SharedPreferences,InternalStorage以及最终的ExternalStorage,但我没有找到这个问题的答案。
是否有任何技术可以有效地制作这样的程序(每次都不读取文件)?
答案 0 :(得分:2)
onPause()
函数时保存到存储。作为InternalStorage与ExternalStorage之间的选择,Android文档会指定每个here和here的详细信息,以便您做出正确的决定。 getBaseContext()
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。
答案 1 :(得分:1)
我不确定你在大局中想要实现的目标。但我会采取措施来回答你更有针对性的问题。
HTH。
答案 2 :(得分:0)
在我看来,您应该为您的应用程序创建一个私人目录。只要您的应用程序正在运行,您就可以从此私有目录中读取。您可以在android.developer页面上使用http://developer.android.com/guide/topics/data/data-storage.html#filesInternal轻松了解如何执行此操作。
我建议你这样做,并在调用Bundle时将Bundle传递给你的意向服务来处理上下文问题。
这是一个简短的示例解决方案:
将这些成员变量添加到您的班级
// Context for the Current Class context
Context callingContext = this;
// final String identifier to Identify the Contents For the new Bundle
private static final String KEY_CONTENTS = "FileContents";
// final String identifier to Identify the Bundle
private static final String KEY_BUNDLE = "FileContentBundle";
// final String File Name Identifier
private static final String FILE_NAME = "private_save_file";
// final Int Value or the Context.MODE_PRIVATE
private static final int PRIVATE = Context.MODE_PRIVATE;
// For the buffer length and file contents
int bufferLength;
String fileContents;
// ***** If your need to write to the file before reading *****
FileOutputStream outputInfo = openFileOutput(FILE_NAME, PRIVATE);
outputInfo.write("Contents to Write to your file.");
outputInfo.close();
// ***** Probably will be using another class to Write to the file ****
// **** Read the information from the file
FileInputStream fileToRead = openFileInput(FILE_NAME);
// Byte Array to write your File Contents To
byte[] buffer = new byte[1024];
// Loop through your files Contents
while((bufferLength = fileToRead.read(buffer) != -1){
fileContents.append(new String(buffer));
}
// Create your new intent and pass in the information from your file
Intent myNewServiceIntent = new Intent();
myNewServiceIntent.setClass(callingContext, MyNewServiceIntent.class);
// Create a new Bundle to pass the file contents
Bundle args = new Bundle();
args.putString(KEY_CONTENTS,fileContents);
myNewServiceIntent.putExtra(KEY_BUNDLE, args);
startActivity(myNewServiceIntent);
您可以使用静态变量来定义要在类中调用意向服务的每次读取的文件名。我不确定你的文件有多大以及Bundle对象的限制,或者这是你想要的。希望这可以帮助。
你可以发布一些代码吗?