未触发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不在前台,也会收到广播。 但这是正确的方法吗? 我从网上的教程中得到了这个注册/取消注册的内容我认为..

  • 在临时演员中没有包含pendingIntent?
  • 如何使用挂起的意图启动新的活动
  • android如何比较挂起的意图
  • 在AlarmManager中获取活动的PendingIntents列表
  • 如何获取和取消PendingIntent?
  • 如何在android中停止警报
  • Android Notification重新启动应用但想要恢复
  • 每次在Android中创建新的待定意图
  • 我在谷歌代码的这个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);