1

到目前为止,我有一个简单的本地服务类。我想要做的是从我的应用程序中的不同活动向这个本地服务发送请求。根据这些请求的参数,服务将通过 HttpClient 连接到网络服务器并接收 JSONObject 并将其返回给活动。所有 HTTP 通信已经在我的活动中运行,但我希望它现在在我的本地服务的单独线程中运行

到目前为止,我非常简单的本地服务的源代码如下所示:

// BackgroundService.java
package com.test.localservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BackgroundService extends Service
{
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("BackgroundService", "onCreate()");
        Thread thr = new Thread(null, new RunThread(), "BackgroundService");
        thr.start();
    }
    class RunThread implements Runnable
    {
        public void run() {
            Log.i("BackgroundService", "run()");

            /* Here the HTTP JSON communication is going to happen */

            //BackgroundService.this.stopSelf();
        }
    }
    @Override
    public void onDestroy()
    {
        Log.i("BackgroundService", "onDestroy()");
        super.onDestroy();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.i("BackgroundService", "onStart()");
        super.onStart(intent, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("BackgroundService", "onBind()");
        return null;
    }

}

我现在面临的问题(由于缺乏知识)是通信部分活动 <--> Local Service。我找到了一些使用AIDL(Android 接口定义语言)的远程服务的通信和对象交换示例。但是,我不确定我是否必须走这条路。我只想交换我自己定义的对象,或者如果这不可能,那么只是一个 JSONObject 或者如果它使事情变得更容易,即使只是简单的字符串数组也可以工作(现在)。

有人可以为我指出正确的方向,如果可能的话,举一个与本地服务进行对象交换(双向)的简单示例。

提前致谢。

4

1 回答 1

5

我建议AsyncTask在这种情况下使用而不是您自己的线程。

要为活动提供对您的BackgroundService对象的引用,您的选择是:

  1. 使用单例(即,使您的BackgroundService对象在静态上下文中可用,例如公共静态数据成员,将 中的静态引用清空onDestroy())。

  2. 按照LocalServiceBindingAPI 示例返回一个IBinder简单地提供对对象的访问权限的BackgroundService对象。

从那里开始,一切都在同一个 JVM 中,因此您可以传递对象。不过要小心,不要保留组件生命周期之后的任何内容(例如,Activity不应缓存单例)。

于 2009-10-09T12:10:07.610 回答