到目前为止,我有一个简单的本地服务课程。我想要做的是在我的应用程序中发送请求到来自不同活动的本地服务。根据这些请求的参数,服务将通过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;
}
}
我现在面临的问题(由于缺乏知识)是沟通部分活动< - >本地服务。我使用AIDL(Android界面定义语言)找到了远程服务的一些通信和对象交换示例。但是,我不确定我是否应该走这条路。我只想交换我自己定义的对象,或者如果那是不可能的那么只是一个JSONObject,或者如果它使事情变得更容易,即使只是简单的String Arrays也可以工作(现在)。
有人可以指出我正确的方向,如果可能的话,给出一个与本地服务进行对象交换(两种方式)的简单示例。
提前致谢。
答案 0 :(得分:5)
我建议在这种情况下使用AsyncTask
而不是你自己的线程。
要为活动提供对BackgroundService
对象的引用,您的选项为:
使用单例(即,使静态上下文中的BackgroundService
对象可用,例如公共静态数据成员,将onDestroy()
中的静态引用置零。)
按照LocalServiceBinding
API示例返回IBinder
,只需访问BackgroundService
对象。
从那里开始,一切都在同一个JVM中,所以你可以只传递对象。但是要小心,不要在组件生命周期之后保留任何内容(例如,Activity
不应该缓存单例)。