Android:IntentService。在哪里保存文件?

时间:2013-11-30 21:36:48

标签: android android-intent android-service alarmmanager intentservice

在看到ianhanniballake的评论之后,这个问题被编辑了。我删除了不相关的部分。

我有一个由AlarmManager重复调用的intent服务,并且读取一些文件(文件内容很少更改)以提取PublicKey对象。

存储文件(定期访问)的最佳位置是什么?什么是最快的记忆? 我想这是SharedPreferences,InternalStorage以及最终的ExternalStorage,但我没有找到这个问题的答案。

是否有任何技术可以有效地制作这样的程序(每次都不读取文件)?

3 个答案:

答案 0 :(得分:2)

  1. 这取决于您对文件的处理方式。我建议在使用您的应用程序时缓存该文件,然后在调用onPause()函数时保存到存储。作为InternalStorage与ExternalStorage之间的选择,Android文档会指定每个herehere的详细信息,以便您做出正确的决定。
  2. 可以使用任何类型的存储,只需参考文档即可了解如何执行此操作。如果您必须在服务的构造函数中传入Context,或者如果您使用IntentService,请使用getBaseContext()
  3. 使用Service类没有任何问题,它为您提供与IntentService相同的功能。但它实现起来更复杂,并且包含绑定到服务的功能,这似乎不需要你在这里做。 IntentService只能启动,并且不能同时处理多个请求(这些请求似乎都不是您的应用程序的问题)。另一件需要注意的是,在UI线程上覆盖Service的类运行,因此您必须实现自己的线程。同样,这不是什么大不了的事,但它增加了代码复杂性,用于访问您甚至可能不需要使用的功能。 From the Android docs
  4.   

    警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

答案 1 :(得分:1)

我不确定你在大局中想要实现的目标。但我会采取措施来回答你更有针对性的问题。

  1. 对于存储文件,您实际上没有太多选择 - 它将是内部或外部文件系统和/或云端。如果要以非文件格式存储数据,您的选择将扩展为包含内置的SQLite数据库和SharedPreferences(持久性)
  2. 我没有看到您不能将IntentService与SharedPreferences或内部存储一起使用。 IntentService和应用程序的其余部分都在相同的Linux用户ID(即进程)下运行。因此,您也应该能够使用SharedPreferences或内部存储。
  3. IntentService扩展Service并自动为您创建工作线程。它使您可以轻松管理线程。如果您只使用Service,则必须自己创建和管理工作线程。因此,IntentService使用起来更方便一些。使用IntentService的唯一缺点是您无法同时处理多个请求,它会对请求进行排队并一次处理一个请求。但是使用Service,您可以根据需要编写代码来处理多个请求。当您使用RPC服务(进程间)时,最好不要使用IntentService并坚持使用普通服务。
  4. 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对象的限制,或者这是你想要的。希望这可以帮助。

你可以发布一些代码吗?