2011-10-19 11 views
1

gpsを使用してモバイルデバイスの位置を更新するアンドロイドサービスを作成するアンドロイドアプリケーションを開発しています。それは 'x'時間に、それが位置をリフレッシュするタイマーで動作します。アンドロイドサービスとの通信

問題は、アプリケーションの1つのアクティビティから、ローカルのアンドロイドサービスとcomunicateしたいと思っています。私は、リフレッシュ時間( 'x')を変更したいからです。それで、どうしたらいいですか?

解決方法の1つは、サービスを停止し、リフレッシュが変更されるたびに再開することですが、最適な解決策ではないと思います。

suggerence、help、pls?

答えて

0

それはあなたがサービスでこれを行う、それはあなたが同じプロセス・スペース(同じアプリケーション/の.apk)内にある場合は、単に確立することができ、この方法では

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

をあなたの場所が更新されます、あなたを助けます

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; 
    } 
} 
:あなたのサービスは、バインダーを必要と

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(); 
} 

:あなたの活動には、単純なサービス接続 は、次のようなものが含まれます

次に、_MyServiceオブジェクトを操作し、その上で任意のメソッドを呼び出すことができます。 (E. g。コールバックの登録またはロケーションアップデートのリクエスト)、サービス接続が失敗した場合、_MyService変数はnullになります。

このサービスに別のアプリケーション(別のプロセス)からアクセスする必要がある場合は、IPCに対処する必要があります。

+0

私はすべてのコードを理解していません。私はいくつかの質問があります:サービスをバインドするアクティビティが終了する、または一時停止されたなどの場合、onResumeはサービスを再起動しますか? – FrioneL

+0

アクティビティのライブバイについては、[Android Documentation](http://developer.android.com/reference/android/app/Activity.html)を参照してください。アクティビティがインテントによって開始された場合、またはバックグラウンドから再開された場合、またはユーザーが起動した場合、OnResumeが呼び出されます。このメソッドでは、サービスへのバインディングが要求されます(bindService)。サービスが現在実行されていない場合は、アンドロイドシステムで開始します(最初のアプリケーションの開始など)。 OnPauseは、メモリリークを回避するために、アクティビティからサービスをバインド解除するだけです。サービスが停止しない、またはシステムによって強制終了された場合、サービスは無期限に続行されます。 – Vertigo

関連する問題