Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

BroadcastReceiver onReceive() not Called when registered dynamically

The function "onReceive" is called when BroadcastReceiver is Registered in the Manifest but NOT called if registered dynamically.

The code that works is below:

public class EyeGesture extends BroadcastReceiver {
    //Eye Gesture
    private static IntentFilter eyeGestureIntent;
    private static Context eyeGestureContext;
    private static StringBuilder gestureInfo = null;
    private static BroadcastReceiver broadcastReceiver;

   // public void startEyeListening() {
        //Eye Gesture

    //}

    @Override
    public void onReceive(Context context, Intent intent) {
       // this = context;
        if (intent.getStringExtra("gesture").equals("WINK")) {
            Log.e("WINKED ","");
        }else {
            Log.e("SOMETHING", "is detected " + intent.getStringExtra("gesture"));
        }
        //Disable Camera Snapshot
       // abortBroadcast();

    }

    public void stopEyeListening() {
        eyeGestureContext.unregisterReceiver(broadcastReceiver);
        eyeGestureIntent = null;
        eyeGestureContext = null;
        gestureInfo = null;
    }

}

Below is the Manifest file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.inno.inno.glassplugin" >

    <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainFunct"
            android:icon="@drawable/ic_glass_logo"
            android:label="@string/title_activity_main_funct" >
            <intent-filter>
                <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
            </intent-filter>
            <meta-data
                android:name="com.google.android.glass.VoiceTrigger"
                android:resource="@xml/voice_trigger" />
        </activity>

        <receiver android:name="com.inno.inno.glassplugin.EyeGesture">
            <intent-filter>
                <action android:name="com.google.android.glass.action.EYE_GESTURE" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

The problem is that "onReceive" is NOT called when registered dynamically. I have to do this in a dynamic way. Below is the code that is NOT working code.

public class EyeGesture extends Activity {
    //Eye Gesture
    IntentFilter eyeGestureIntentFilter;
    Context eyeGestureContext;
    BroadcastReceiver broadcastReceiver;


    public  EyeGesture(){
        Log.e("CONSTRUCTOR ", "");
        eyeGestureContext = MainFunct.getCurrentContext();
        eyeGestureIntentFilter = new IntentFilter("com.google.glass.action.EYE_GESTURE");
        eyeGestureIntentFilter.setPriority(1000);
        startRunning();
    }

    void startRunning(){
        eyeGestureContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.e("Received ", " Something");
            }
        },eyeGestureIntentFilter);
    }


    @Override
    public  void onResume(){
        super.onResume();
    }

    @Override
    public  void  onPause(){
        super.onPause();
        unregisterReceiver(broadcastReceiver);
    }
    public void stopEyeListening() {
        eyeGestureContext.unregisterReceiver(broadcastReceiver);
        eyeGestureIntentFilter = null;
        eyeGestureContext = null;
    }

}

Also, I don't want to extend BroadcastReceiver from this class. Why am I not receiving anything if registered dynamically. I also removed the following line from the Manifest:

 <receiver android:name="com.inno.inno.glassplugin.EyeGesture">
                <intent-filter>
                    <action android:name="com.google.android.glass.action.EYE_GESTURE" />
                </intent-filter>
 </receiver>

but still, it is not working. There is no error or exception thrown. What am I doing wrong?

like image 709
Programmer Avatar asked Dec 09 '14 19:12

Programmer


People also ask

What is the role of the onReceive () method in the BroadcastReceiver?

Creating a BroadcastReceiver The onReceiver() method is first called on the registered Broadcast Receivers when any event occurs. The intent object is passed with all the additional data. A Context object is also available and is used to start an activity or service using context.

How do I check if BroadcastReceiver is registered?

registerReceiver(BroadcastReceiver,IntentFilter) */ public Intent register(Context context, IntentFilter filter) { try { // ceph3us note: // here I propose to create // a isRegistered(Contex) method // as you can register receiver on different context // so you need to match against the same one :) // example by ...

What file is used to register the BroadcastReceiver?

You register this broadcast receiver either in the manifest file or in the code. These events are intents. So, whenever these kinds of events happen, an intent is triggered.


2 Answers

Are you using explicit intent? It seems that dynamically registered broadcast receivers cannot receive explicit intents. Implicit intents work. For reference: http://streamingcon.blogspot.com/2014/04/dynamic-broadcastreceiver-registration.html

If the issue is not explicit intents but if you are using LocalBroadcastManager for sendBroadcast then make sure that the registerReceiver is also called of LocalBroadcastManager and not of Context

like image 88
Akshat Asawa Avatar answered Sep 28 '22 05:09

Akshat Asawa


Try using ApplicationContext instead of Activity.

Modyifing line:

eyeGestureContext = MainFunct.getCurrentContext();

I would try things in this order:

  1. eyeGestureContext = getApplicationContext();
  2. eyeGestureContext = getApplication();

If above does not work I would extend the Application and do:

public class MyExtendedApplication extends Application {

    private static MyExtendedApplication instance;

    public static MyExtendedApplication getInstance() {
        return instance;
    }
}

This works for me with global "android.net.conn.CONNECTIVITY_CHANGE" broadcast

Context c = MyExtendedApplication.getInstance();
c.registerReceiver(
        connectivtyChangedReceiver,
        connectivityFilter);

so should also for you with "com.google.android.glass.action.EYE_GESTURE"

like image 26
Jerzy Kiler Avatar answered Sep 28 '22 05:09

Jerzy Kiler