Android:如何与本地服务通信和交换对象?

Android:如何与本地服务通信和交换对象?,android,json,http,android-service,Android,Json,Http,Android Service,到目前为止,我有一个简单的本地服务类。我想做的是从我的应用程序中的不同活动向本地服务发送请求。根据这些请求的参数,服务将通过HttpClient连接到Web服务器,并接收JSONObject并将其返回给活动。所有HTTP通信都已在我的活动中运行,但我希望它现在在本地服务的一个单独线程中运行 到目前为止,我的非常简单的本地服务的源代码如下所示: // BackgroundService.java package com.test.localservice; import android.app.

到目前为止,我有一个简单的本地服务类。我想做的是从我的应用程序中的不同活动向本地服务发送请求。根据这些请求的参数,服务将通过HttpClient连接到Web服务器,并接收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;
    }

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

有人能告诉我正确的方向吗?如果可能的话,给我举一个简单的例子,说明如何使用本地服务进行对象交换(双向)


提前感谢。

我建议在这种情况下使用
异步任务
而不是您自己的线程

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

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

  • 按照
    LocalServiceBinding
    API示例返回一个
    IBinder
    ,它只允许访问
    BackgroundService
    对象


  • 从那时起,所有东西都在同一个JVM中,因此您可以只传递对象。不过,要小心,不要在组件生命周期之后保留任何内容(例如,
    活动
    不应缓存单例)。

    我建议在这种情况下使用
    异步任务
    而不是您自己的线程

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

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

  • 按照
    LocalServiceBinding
    API示例返回一个
    IBinder
    ,它只允许访问
    BackgroundService
    对象


  • 从那时起,所有东西都在同一个JVM中,因此您可以只传递对象。但要小心,不要在组件生命周期之后保留任何内容(例如,
    活动
    不应缓存单例)。

    谢谢。LocalServiceBinding API示例实际上帮助很大。这项任务也是一个很好的提示。对于那些需要Android线程帮助的人,这里有一篇来自开发团队的好博文:谢谢。LocalServiceBinding API示例实际上帮助很大。这项任务也是一个很好的提示。对于那些需要Android线程帮助的人,这里有一篇来自开发团队的好博文: