Commit a21a4d24 authored by Max Lv's avatar Max Lv

stop the service in time

parent 4bbbc6b7
...@@ -5,8 +5,8 @@ import sbtandroid._ ...@@ -5,8 +5,8 @@ import sbtandroid._
import sbtandroid.AndroidPlugin._ import sbtandroid.AndroidPlugin._
object App { object App {
val version = "2.1.0" val version = "2.1.1"
val versionCode = 61 val versionCode = 62
} }
object General { object General {
......
...@@ -50,6 +50,7 @@ import android.content.Context ...@@ -50,6 +50,7 @@ import android.content.Context
trait BaseService { trait BaseService {
var state = State.INIT var state = State.INIT
var callbackCount = 0
final val callbacks = new RemoteCallbackList[IShadowsocksServiceCallback] final val callbacks = new RemoteCallbackList[IShadowsocksServiceCallback]
...@@ -63,11 +64,20 @@ trait BaseService { ...@@ -63,11 +64,20 @@ trait BaseService {
} }
override def unregisterCallback(cb: IShadowsocksServiceCallback) { override def unregisterCallback(cb: IShadowsocksServiceCallback) {
if (cb != null ) callbacks.unregister(cb) if (cb != null ) {
callbacks.unregister(cb)
callbackCount -= 1
}
if (callbackCount == 0 && state != State.CONNECTING && state != State.CONNECTED) {
stopBackgroundService()
}
} }
override def registerCallback(cb: IShadowsocksServiceCallback) { override def registerCallback(cb: IShadowsocksServiceCallback) {
if (cb != null) callbacks.register(cb) if (cb != null) {
callbacks.register(cb)
callbackCount += 1
}
} }
override def stop() { override def stop() {
...@@ -79,6 +89,7 @@ trait BaseService { ...@@ -79,6 +89,7 @@ trait BaseService {
} }
} }
def stopBackgroundService()
def startRunner(config: Config) def startRunner(config: Config)
def stopRunner() def stopRunner()
def getServiceMode: Int def getServiceMode: Int
......
...@@ -326,6 +326,11 @@ class Shadowsocks ...@@ -326,6 +326,11 @@ class Shadowsocks
override def onServiceDisconnected(name: ComponentName) { override def onServiceDisconnected(name: ComponentName) {
switchButton.setEnabled(false) switchButton.setEnabled(false)
try {
bgService.unregisterCallback(callback)
} catch {
case ignored: RemoteException => // Nothing
}
bgService = null bgService = null
} }
} }
......
...@@ -526,6 +526,16 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -526,6 +526,16 @@ class ShadowsocksNatService extends Service with BaseService {
// reset NAT // reset NAT
killProcesses() killProcesses()
// stop the service if no callback registered
if (callbackCount == 0) {
stopSelf()
}
}
override def stopBackgroundService() {
stopRunner()
stopSelf()
} }
override def getTag = TAG override def getTag = TAG
......
...@@ -252,6 +252,10 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -252,6 +252,10 @@ class ShadowsocksVpnService extends VpnService with BaseService {
} }
override def onRevoke() {
stopRunner()
}
def killProcesses() { def killProcesses() {
val sb = new StringBuilder val sb = new StringBuilder
...@@ -373,6 +377,16 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -373,6 +377,16 @@ class ShadowsocksVpnService extends VpnService with BaseService {
// reset notifications // reset notifications
notificationManager.cancel(1) notificationManager.cancel(1)
// stop the service if no callback registered
if (callbackCount == 0) {
stopSelf()
}
}
override def stopBackgroundService() {
stopRunner()
stopSelf()
} }
override def getTag = TAG override def getTag = TAG
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment