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:如何与本地服务通信和交换对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何让我的Lambda函数与在本地计算机上运行的服务器通信?