与Android服务通信

时间:2011-10-19 10:05:26

标签: android service android-activity

我正在开发一个Android应用程序,它创建一个Android服务,使用gps刷新移动设备的位置。它适用于计时器,在'x'时间,它会刷新位置。

问题是我想从应用程序的一个活动与该本地android服务进行通信,因为我想在需要时更改刷新时间('x')。那么,我该怎么做呢?

一种可能的解决方案是停止服务,然后每次更改时间时再次启动,但我认为这不是最佳解决方案。

任何建议,帮助,请?

2 个答案:

答案 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");
                            }
 };