11# -------------------------------------------------------------------
22# Broadcast receiver bridge
3-
3+ import logging
44from jnius import autoclass , PythonJavaClass , java_method
55from 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
811class 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