未触发Android通知操作(PendingIntent)

我正在尝试在我的应用程序中添加通知操作项,这是一个音乐播放器。 启动流时,应触发通知,并在通知中显示流的停止按钮。 到目前为止通知工作正常,我遇到了停止操作项目的问题。 以下是在启动流的服务中声明它的方式:

Intent stopIntent = new Intent(this, MusicPlayerNew.class); stopIntent.putExtra("STOP", "STOP"); PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0, stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null); mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent); 

现在在onResume() – 我的活动方法中,我用getIntent()。getStringExtra()检查“STOP”额外,但我通过getIntent()检索的意图没有设置额外的东西:(

我还试图检查发送广播(我有一个广播接收器工作从服务到活动通信)

 Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER); PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 

现在,如果活动当前位于前台,则此function正常。 如果活动在后台,则停止按钮不执行任何操作:(

编辑:我在我的Activity中将BroadcastReceiver作为私有类

 private class DataUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { .. }} 

在onResume()中注册我的app接收器:

 intentFilter = new IntentFilter(STOP_MEDIAPLAYER); registerReceiver(dataUpdateReceiver, intentFilter); 

的onPause()

 unregisterReceiver(dataUpdateReceiver); 

现在,如果我从onPause() – 方法中删除取消注册,即使app / activity不在前台,也会收到广播。 但这是正确的方法吗? 我从网上的教程中得到了这个注册/取消注册的内容我认为..

我在谷歌代码的这个post中find了解决方案https://code.google.com/p/android/issues/detail?id=61850

要修复它,您必须将PendingIntent.FLAG_CANCEL_CURRENT标志添加到PendingIntent

 PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT); 

我今天遇到了这个问题。 在我的情况下,它使用来自之前的intent实例的缓存intent extras,因为pendingIntent构造函数的所有参数都是相同的。 我find了两个解决方案……

  1. 使用Nik提到的FLAG_CANCEL_CURRENT。
  2. 将唯一的requestCode传递给pendingIntent ,如下所示

     PendingIntent pi = PendingIntent.getService(this, UNIQUE_ID, pi, 0); 

在我的情况下,第二种方法解决了问题,因为我需要保持以前的通知存活。 可能这将有助于有类似问题的人。

这是非常晚的答案,但它可能会帮助某人:

您应该根据要运行的意图选择正确的Pending intent。 这里有些例子:

对于活动使用如下:

 Intent i = new Intent(this, YourActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 

对于以下服务使用:

 Intent i = new Intent(this, YourService.class); PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 

对于广播接收器使用如下:

 Intent i = new Intent(this, YourReciver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); 

如果需要,您可能需要更改请求代码和标志

我今天遇到了这个问题,这是由于活动未被注册或添加到AndroidManifest.xml引起的 。 我以为我在那里有它,但事实并非如此。 此外,尝试使用其意图调用操作时未记录任何错误。

我通过创建一个intent然后在不使用通知的情况下调用startAcitivty(intent)来解决这个问题。 然后它给了我一个错误,说明清单中可能缺少活动。

如果其他答案都没有解决您的问题,那么希望这样做。 通常棘手的问题是简单而愚蠢的结果。

除了使用广播接收器之外,您还应该使用服务并以这种方式在您的服务中声明一个新动作:

 public final String ACTION_STOP = "yourpackagename.ACTION_STOP"; 

然后像这样创建你的意图:

 Intent stopIntent = new Intent(this, YourService.class).setAction(YourService.ACTION_STOP); PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0); 

当然,如果intent的动作等于ACTION_STOP ,则在服务的函数startCommand停止播放。

这应该做的伎俩;)

由于您在onPause中取消注册,因此当它在后台时您不会收到广播。 将unregisterReceiver代码移动到onDestroy函数。 只有在活动被销毁时才会调用此方法。 或者,您可以在预期事件发生后取消注册。

这里有几个问题:

第1部分:为什么你的意图没有额外收到“停止”? 虽然在您提供的代码中没有看到,但我想确认您是否使用标志FLAG_ACTIVITY_SINGLE_TOP作为通知意图? 如果是这样,您在活动中收到的意图将是启动活动的意图,因此“STOP”额外function将无法使用。 在这种情况下(发送新意图的地方onNewIntent()您将需要扩展onNewIntent() )。 更多信息在这里 。
如果您尚未使用FLAG_ACTIVITY_SINGLE_TOP,则表示在点击通知时会创建新活动,在这种情况下,Intent必须具有“STOP”参数。 如果您能提供我所有相关的代码,我可以帮助您更好。

第2部分:使用广播接收器正如您已经发现的那样,这不是直截了当的。 您需要在onDestroy中取消注册,如果您的活动被用户关闭,则可能会调用onDestroy,并且您的广播接收器可能在用户点击通知时不活动。 如果你根本没有取消注册,它可能似乎正在工作,但这是一个内存泄漏,GC可能会随时清理,这可能会导致程序崩溃,即,你必须取消注册。 如果你需要使用广播接收器方法,你需要有一个服务来做这个和服务带来自己的陷阱 – >重新启动系统,电池耗尽等。我强烈建议你采取第一种方法。

我有一个非常相似的问题,但一个非常不同的解决方案 如果您在manifest.xml文件中声明了 ,则也不会触发挂起的意图。

android:enabled="false"替换为android:enabled="true"

这可能不是问题的直接问题。 但是如果你使用默认模板在android studio中创建服务,它会自动将这些属性添加到服务中。

对我来说,解决方案是设置意图的标志:

 resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);