1

J'essaie de créer une notification simple avec un bouton (action) défini. J'ai réussi à l'afficher correctement et créer un PendingIntent pour mon action. J'ai également créé un BroadcastReceiver qui est censé être appelé lorsque mon action est cliquée. Mais c'est la méthode onReceive() qui n'est pas appelée. Je ne sais pas pourquoi. J'ai aussi enregistré BroadcastReceiver dans AndroidManifest.xmlBroadcastReceiver ne déclenche pas l'action de notification. Cliquez sur

MainActivity.java

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button notify = (Button) findViewById(R.id.notify); 

    notify.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Intent dismissIntent = new Intent("action1"); 
      dismissIntent.setAction("action1"); 
      PendingIntent action1intent = PendingIntent.getBroadcast(MainActivity.this, (int) System.currentTimeMillis(), dismissIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

      NotificationCompat.Builder mBuilder = 
        new NotificationCompat.Builder(MainActivity.this) 
          .setSmallIcon(R.drawable.ic_menu) 
          .setContentTitle("My notification") 
          .setContentText("Hello World!") 
          .addAction(R.drawable.ic_menu, "action 1", action1intent); 

      Intent resultIntent = new Intent(MainActivity.this, MainActivity.class); 
      TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainActivity.this); 
      stackBuilder.addParentStack(MainActivity.class); 
      stackBuilder.addNextIntent(resultIntent); 

      PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

      mBuilder.setContentIntent(resultPendingIntent); 
      NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

      mNotificationManager.notify(0, mBuilder.build()); 
     } 
    }); 

} 

public class Receiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Log.d("log", "Receiving somthn"); 

     String whichAction = intent.getAction(); 

     if (whichAction.equals("action1")) { 
      MainActivity.makeToast("This is action 1", context); 
     } 
    } 
} 


public static void makeToast(String string, Context context) { 
    Toast.makeText(context, string, Toast.LENGTH_SHORT).show(); 
} 
} 

AndroidManifest.xml

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <receiver android:name=".MainActivity$Receiver"> 
     <intent-filter> 
      <action android:name="com.example.orglce.notification.BROADCAST" /> 
     </intent-filter> 
    </receiver> 

    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Répondre

2

Tout d'abord, si vous allez utiliser .MainActivity$Receiver, puis Receiver besoins de être une classe static.

En second lieu, dismissIntent est (redondance) en utilisant action1 comme la chaîne d'action, mais le <intent-filter> utilise com.example.orglce.notification.BROADCAST. Ceux-ci ne correspondent pas. Je recommande de se débarrasser de la <intent-filter>, se débarrasser de la action1, et en utilisant new Intent(this, Receiver.class) pour créer un Intent explicite pour identifier votre BroadcastReceiver.

+0

Oui, ça a marché! Passage à 'new Intent (this, Receiver.class)'. Auparavant, j'avais déjà 'new Intent (this, MainActivity.class)' mais cela ne fonctionnait pas, il ne me venait pas à l'esprit que je devais associer l'intention à Receiver.class et non à MainActivity.class. Merci beaucoup! :) – orglce