Skip to content

Commit c63d8e2

Browse files
authored
Fix broadcast receiver (#3168)
* Update broadcastReceiver * Undo unnecessary changes. * Update broadcast.py
1 parent 2a4746d commit c63d8e2

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

pythonforandroid/recipes/android/src/android/broadcast.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# -------------------------------------------------------------------
22
# Broadcast receiver bridge
3-
3+
import logging
44
from jnius import autoclass, PythonJavaClass, java_method
55
from android.config import JAVA_NAMESPACE, JNI_NAMESPACE, ACTIVITY_CLASS_NAME, SERVICE_CLASS_NAME
66

7+
logger = logging.getLogger("BroadcastReceiver")
8+
logger.setLevel(logging.DEBUG)
9+
710

811
class BroadcastReceiver(object):
912

@@ -22,6 +25,7 @@ def onReceive(self, context, intent):
2225
def __init__(self, callback, actions=None, categories=None):
2326
super().__init__()
2427
self.callback = callback
28+
self._is_registered = False
2529

2630
if not actions and not categories:
2731
raise Exception('You need to define at least actions or categories')
@@ -58,15 +62,36 @@ def _expand_partial_name(partial_name):
5862
self.receiver_filter.addCategory(x)
5963

6064
def start(self):
61-
Handler = autoclass('android.os.Handler')
65+
66+
if hasattr(self, 'handlerthread') and self.handlerthread.isAlive():
67+
logger.debug("HandlerThread already running, skipping start")
68+
return
69+
70+
HandlerThread = autoclass('android.os.HandlerThread')
71+
self.handlerthread = HandlerThread('handlerthread')
6272
self.handlerthread.start()
73+
74+
if self._is_registered:
75+
logger.info("Already registered.")
76+
return
77+
78+
Handler = autoclass('android.os.Handler')
6379
self.handler = Handler(self.handlerthread.getLooper())
6480
self.context.registerReceiver(
6581
self.receiver, self.receiver_filter, None, self.handler)
82+
self._is_registered = True
6683

6784
def stop(self):
68-
self.context.unregisterReceiver(self.receiver)
69-
self.handlerthread.quit()
85+
try:
86+
self.context.unregisterReceiver(self.receiver)
87+
self._is_registered = False
88+
except Exception as e:
89+
logger.error("unregisterReceiver failed: %s", e)
90+
91+
if hasattr(self, 'handlerthread'):
92+
self.handlerthread.quitSafely()
93+
self.handlerthread = None
94+
self.handler = None
7095

7196
@property
7297
def context(self):

0 commit comments

Comments
 (0)