0

我有一种方法可以返回一个BufferedReader我的应用程序从中获取另一个程序的输出的方法。

在 Manager.java 中

public BufferedReader start() {
    String[] commandLine2 = { "/system/bin/sh", "/system/app/launcher.sh" };

    Process process = null;

    try {
        process = Runtime.getRuntime().exec(commandLine2);
        reader = new BufferedReader(new InputStreamReader(
                process.getInputStream()));
        writer = new OutputStreamWriter(process.getOutputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return reader;
}

在我的 MainActivity 中,我使用: outputReader = manager.start();其中 outputReader 是一个私有实例,BufferedReader而 manager 是 Manager 之一。

只要我在 MainActivity.java 内的 AsyncTask 中使用这个缓冲阅读器,一切都会正常,因为我BufferedReader在其范围内是可见的,但是当我想使用服务来完成任务时,我遇到了一些麻烦。

没有办法使用Intent.putExtra(Object)既不是 Serializable 也不是 Parcelable 的对象(我的 BufferedReader 不是)。

那么我怎样才能将我的传递BufferedReader给服务呢?

4

2 回答 2

1

我建议你使用Bound Service

http://developer.android.com/guide/components/bound-services.html

绑定服务是客户端-服务器接口中的服务器。绑定服务允许组件(例如活动)绑定到服务,发送请求,接收响应,甚至执行进程间通信(IPC)

基本上,您可以在服务上公开公共方法并调用它们。因此,在这种情况下,您可以在服务中创建类似以下内容:

public void setReader(BufferedReader reader) {
    this.reader = reader;
    // do whatever you want with it in your service, etc.
}

并从您的活动中调用它。

有关更多详细信息,请参阅这篇精彩的帖子:Android - 在 Activity 中使用服务中的方法?

于 2013-06-28T14:33:34.050 回答
1

我只传递带有 Intent.putExtra 的原语,并且只有少数几个。当我需要更多原语时,我将声明一个 DataTransferObjectOfMyType 将它们结合在一起。我将 dto 设置为一个共同的地方,例如 MyApplication 类中的 ApplicationContext 。关于新意图,我正在检查是否存在并使用它。设计好坏我不在乎。这是工作。如果这一切对您来说也很重要,那么请使用这种方法,因为它正在工作:)

顺便说一句:我不会通过缓冲阅读器,因为谁知道什么时候需要关闭。取而代之的是,我将传递创建 BufferedReader 所需的所有参数。

我希望它有帮助!

于 2013-06-28T13:08:09.523 回答