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

Posted

技术标签:

【中文标题】Android:如何与本地服务通信和交换对象?【英文标题】:Android: How to communicate and exchange objects with a Local Service? 【发布时间】:2010-12-05 06:39:13 【问题描述】:

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


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

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

提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

    按照LocalServiceBinding API 示例返回一个IBinder,它只是提供对BackgroundService 对象的访问权限。

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

【讨论】:

谢谢。 LocalServiceBinding API 示例实际上帮助很大。 AsyncTask 也是一个很好的提示。对于那些在 Android 线程方面需要帮助的人,这里有一篇来自开发团队的好博文:android-developers.blogspot.com/2009/05/painless-threading.html

以上是关于Android:如何与本地服务通信和交换对象?的主要内容,如果未能解决你的问题,请参考以下文章

Android 09 服务 使用服务进行本地进程通信

Android 试图让我的应用与本地服务通信

JS里AJAX的使用--(服务器与客户端数据交换)

如何让我的Lambda函数与在本地计算机上运行的服务器通信?

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

“本地主机”与“127.0.0.1”性能