5
votes

The below code should describe an app where once the widget button is clicked, it sends off an intent that should be received by TestReceiver. However, in running my below code, the onReceive of TestReceiver is never called.

Could someone let me know what I'm doing wrong?

Widget code

public class Widget extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];

        // Create an Intent to launch ExampleActivity
        //Intent intent = new Intent(context.getApplicationContext(), TestReceiver.class);
        Intent intent = new Intent();
        intent.setAction(TestReceiver.TEST_INTENT);
        intent.setClassName(TestReceiver.class.getPackage().getName(), TestReceiver.class.getName());

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // Get the layout for the App Widget and attach an on-click listener to the button
        RemoteViews views;

       views = new RemoteViews(context.getPackageName(), R.layout.main);     

        views.setOnClickPendingIntent(R.id.btnTest, pendingIntent);

        // Tell the AppWidgetManager to perform an update on the current App Widget
        appWidgetManager.updateAppWidget(appWidgetId, views);



    }


}

}

Receiver Code:

   public class TestReceiver extends BroadcastReceiver {

     public static final String TEST_INTENT= "MyTestIntent";

     @Override
     public void onReceive(Context context, Intent intent) {
      // TODO Auto-generated method stub

      Toast.makeText(context, "Test", Toast.LENGTH_SHORT);

      if(intent.getAction()==TEST_INTENT)
      {
         System.out.println("GOT THE INTENT");

       Toast.makeText(context, "Test", Toast.LENGTH_SHORT);
      }
     }

    }

Manifest:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.intenttest"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
  <receiver android:name=".TestReceiver" android:label="@string/app_name">
   <intent-filter>
    <action android:name="MyTestIntent">
    </action>
   </intent-filter>
  </receiver>
  <receiver android:label="@string/app_name" android:name="Widget">
   <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
   </intent-filter>
   <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget"  />
  </receiver>
    </application>
    <uses-sdk android:minSdkVersion="3" />

</manifest> 
2
Stupid question first - does it work if you just create a regular Intent() and call startActivity() somewhere in your app? Just making sure the receiver is set up correctly. - EboMike
I added context.sendBroadcast(intent); to the onUpdate function in the widget. Debugging it now, it seems like its calling the receiver on that statement and now when I'm clicking the button. I think I was getting confused because the Toast call I was making doesn't do anything. - Kratz
Yep, cause you didn't add .show() :) - EboMike
Aw, jeeze. The struggles of learning new stuff. Oh well, at least its working finally. - Kratz
Not adding show() at the end of a Toast is such a common mistake. In any case, glad it works. Hey, I might as well add an answer to finalize this question. - EboMike

2 Answers

9
votes

It probably works, but you forgot to add .show() at the end of your Toast :)

0
votes

== tests for reference equality (whether they are the same object).

.equals() tests for value equality (whether they are logically "equal").

String values are compared using '==' not 'equals'

This "if(intent.getAction()==TEST_INTENT)" change this "if(intent.getAction().equals(TEST_INTENT))"

and of course Toast.makeText(context, "Test", Toast.LENGTH_SHORT).show();

All code:

package *********;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;


public class TestReceiver extends BroadcastReceiver {

    public static final String TEST_INTENT= "MyTestIntent";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        Toast.makeText(context, "Test holaaa", Toast.LENGTH_SHORT).show();

       if(intent.getAction() == TEST_INTENT)
          //  if(intent.getAction().equals(TEST_INTENT))
        {
            System.out.println("GOT THE INTENT");

            Toast.makeText(context, "Test Goooo", Toast.LENGTH_SHORT).show();
        }
    }
}