diff --git a/pythonforandroid/recipes/android/src/android/broadcast.py b/pythonforandroid/recipes/android/src/android/broadcast.py index 750e9c87e..acf368d0b 100644 --- a/pythonforandroid/recipes/android/src/android/broadcast.py +++ b/pythonforandroid/recipes/android/src/android/broadcast.py @@ -22,6 +22,7 @@ def onReceive(self, context, intent): def __init__(self, callback, actions=None, categories=None): super().__init__() self.callback = callback + self._is_registered = False if not actions and not categories: raise Exception('You need to define at least actions or categories') @@ -58,15 +59,36 @@ def _expand_partial_name(partial_name): self.receiver_filter.addCategory(x) def start(self): - Handler = autoclass('android.os.Handler') + + if hasattr(self, 'handlerthread') and self.handlerthread.isAlive(): + print("HandlerThread already running, skipping start") + return + + HandlerThread = autoclass('android.os.HandlerThread') + self.handlerthread = HandlerThread('handlerthread') self.handlerthread.start() + + if self._is_registered: + print("[BroadcastReceiver] Already registered.") + return + + Handler = autoclass('android.os.Handler') self.handler = Handler(self.handlerthread.getLooper()) self.context.registerReceiver( self.receiver, self.receiver_filter, None, self.handler) + self._is_registered = True def stop(self): - self.context.unregisterReceiver(self.receiver) - self.handlerthread.quit() + try: + self.context.unregisterReceiver(self.receiver) + self._is_registered = False + except Exception as e: + print("[BroadcastReceiver] unregisterReceiver failed:", e) + + if hasattr(self, 'handlerthread'): + self.handlerthread.quitSafely() + self.handlerthread = None + self.handler = None @property def context(self):