我正在开发一个Android应用程序,它创建一个Android服务,使用gps刷新移动设备的位置。它适用于计时器,在'x'时间,它会刷新位置。
问题是我想从应用程序的一个活动与该本地android服务进行通信,因为我想在需要时更改刷新时间('x')。那么,我该怎么做呢?
一种可能的解决方案是停止服务,然后每次更改时间时再次启动,但我认为这不是最佳解决方案。
任何建议,帮助,请?
答案 0 :(得分:3)
如果您在同一个Process-Space(相同应用程序/ .apk)中,则可以建立一个简单的服务连接 在您的活动中,请包含以下内容:
private ServiceConnection _svcConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
_myService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
_myService = ((MyService.LocalBinder) service).getService();
if(!_myService.IsRunning())
_myService.Start();
}
};
@Override
protected void onResume() {
bindService(new Intent(Main.this, MyService.class), _svcConnection
BIND_AUTO_CREATE);
startService(new Intent(Main.this, MyService.class));
super.onResume();
}
@Override
protected void onPause() {
unbindService(_svcConnection);
super.onPause();
}
您的服务需要一个活页夹:
private final IBinder _Binder = new LocalBinder();
@Override
public IBinder onBind(Intent arg0) {
return _Binder;
}
/**
* Class for clients to access. Because we know this service always runs in
* the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
然后,您可以使用_MyService对象并在其上调用任何Method。 (例如,注册回调或请求位置更新),但请注意,如果服务连接失败,_MyService变量将为null!
_MyService.SetInterval(4);
如果您需要从另一个应用程序(另一个进程)访问此服务,则必须处理IPC。
答案 1 :(得分:0)
它会帮助你,你在服务中这样做,它会刷新你在这个方法中的位置
Timer timer = new Timer("Refresh Time");
timer.schedule(RefreshTask, 1000L, 60 * 1000L);
private TimerTask refreshTask = new TimerTask() {
@Override
public void run() {
Log.i(TAG, "Update time here");
}
};