|
28 | 28 | import android.os.RemoteException; |
29 | 29 | import android.util.Log; |
30 | 30 |
|
| 31 | +import java.lang.ref.WeakReference; |
| 32 | + |
31 | 33 | /** |
32 | 34 | * This class provides a base class for recognition service implementations. This class should be |
33 | 35 | * extended only in case you wish to implement a new speech recognizer. Please note that the |
@@ -315,40 +317,46 @@ public void rmsChanged(float rmsdB) throws RemoteException { |
315 | 317 | } |
316 | 318 |
|
317 | 319 | /** Binder of the recognition service */ |
318 | | - private static class RecognitionServiceBinder extends IRecognitionService.Stub { |
319 | | - private RecognitionService mInternalService; |
| 320 | + private static final class RecognitionServiceBinder extends IRecognitionService.Stub { |
| 321 | + private final WeakReference<RecognitionService> mServiceRef; |
320 | 322 |
|
321 | 323 | public RecognitionServiceBinder(RecognitionService service) { |
322 | | - mInternalService = service; |
| 324 | + mServiceRef = new WeakReference<RecognitionService>(service); |
323 | 325 | } |
324 | 326 |
|
| 327 | + @Override |
325 | 328 | public void startListening(Intent recognizerIntent, IRecognitionListener listener) { |
326 | 329 | if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder()); |
327 | | - if (mInternalService != null && mInternalService.checkPermissions(listener)) { |
328 | | - mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler, |
329 | | - MSG_START_LISTENING, mInternalService.new StartListeningArgs( |
| 330 | + final RecognitionService service = mServiceRef.get(); |
| 331 | + if (service != null && service.checkPermissions(listener)) { |
| 332 | + service.mHandler.sendMessage(Message.obtain(service.mHandler, |
| 333 | + MSG_START_LISTENING, service.new StartListeningArgs( |
330 | 334 | recognizerIntent, listener))); |
331 | 335 | } |
332 | 336 | } |
333 | 337 |
|
| 338 | + @Override |
334 | 339 | public void stopListening(IRecognitionListener listener) { |
335 | 340 | if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder()); |
336 | | - if (mInternalService != null && mInternalService.checkPermissions(listener)) { |
337 | | - mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler, |
| 341 | + final RecognitionService service = mServiceRef.get(); |
| 342 | + if (service != null && service.checkPermissions(listener)) { |
| 343 | + service.mHandler.sendMessage(Message.obtain(service.mHandler, |
338 | 344 | MSG_STOP_LISTENING, listener)); |
339 | 345 | } |
340 | 346 | } |
341 | 347 |
|
| 348 | + @Override |
342 | 349 | public void cancel(IRecognitionListener listener) { |
343 | 350 | if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder()); |
344 | | - if (mInternalService != null && mInternalService.checkPermissions(listener)) { |
345 | | - mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler, |
| 351 | + final RecognitionService service = mServiceRef.get(); |
| 352 | + if (service != null && service.checkPermissions(listener)) { |
| 353 | + service.mHandler.sendMessage(Message.obtain(service.mHandler, |
346 | 354 | MSG_CANCEL, listener)); |
347 | 355 | } |
348 | 356 | } |
349 | 357 |
|
350 | 358 | public void clearReference() { |
351 | | - mInternalService = null; |
| 359 | + mServiceRef.clear(); |
352 | 360 | } |
353 | 361 | } |
354 | 362 | } |
0 commit comments