Android的通知操作,不会触发(的PendingIntent)(Android Notifica

2019-07-19 19:33发布

我想在我的应用程序是一个音乐播放器添加一个通知操作项目。 当流启动的通知应被触发并流的停止按钮应显示在notfication。 通知做工精细,到目前为止,我有停止操作项目的麻烦。 下面是它是如何在开始流服务声明:

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); 

现在,如果该活动是当前在前台工作的。 如果活动是在后台停止按钮不执行任何操作:(

编辑:我在活动中的广播接收器作为一个私有类

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

在的onResume()注册我的这个接收器应用程序:

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

的onPause()

unregisterReceiver(dataUpdateReceiver);

方法广播接收,即使应用程序/活动是不是在前台了 - 现在,如果我从的onPause()删除注销。 但是,这是做正确的方式? 我得到这个注册/注销-东西从web我认为一个教程..

Answer 1:

我觉得在这个线程在谷歌代码解决方案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);


Answer 2:

这是非常晚的答案,但它可以帮助别人:

你应该选择基于要运行的意图的正确的挂起的意图。 这里有些例子:

对于活动下使用:

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);

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



Answer 3:

今天我就遇到了这个问题。 在我的情况下,它是使用缓存从意向的前一个实例意图演员作为所有参数pendingIntent构造是一样的。 我发现这两种解决方案...

  1. 使用FLAG_CANCEL_CURRENT由提到尼克 。
  2. 传递一个独特requestCodependingIntent如下

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

就我而言,第二种方法解决了这个问题,因为我需要保留以前的通知活着。 可能这将有助于有人用类似的问题。



Answer 4:

我今天就遇到了这个问题,它是由没有被注册或添加到AndroidManifest.xml中的活动引起的。 我原本以为它在那里,但事实并非如此。 此外,正在试图通过调用其意图的动作,记录没有错误。

我想通了这一点通过创建一个意图,然后在不使用的通知调用startAcitivty(意图)。 然后,它给了我一个错误,说明该活动很可能从清单丢失。

如果没有其他的答案解决您的问题,那么希望这将。 通常棘手的问题是一些简单的和愚蠢的结果。



Answer 5:

超过使用广播接收器,你应该使用一个服务,并宣布在服务这样一个新的动作:

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);

当然,在停止服务的功能进行播放的startCommand ,如果意图的行动等于ACTION_STOP

这应该做的伎俩;)



Answer 6:

当它在后台,因为你是在在onPause注销你不接收广播。 移动unregisterReceiver代码的onDestroy功能。 这只会当活动被销毁被调用。 或者,你可以注销一旦发生预期的事件。



Answer 7:

这里有多种问题:

第1部分:为什么你的意图没有收到“停止”多余的? 虽然它不是在代码中看到您所提供的,我想确认,如果你正在使用的标志为FLAG_ACTIVITY_SINGLE_TOP通知意图是什么? 如果是这样,您在活动收到的意图将是启动的活动,因此“STOP”的意图额外将不可用。 您将需要延长onNewIntent()是这样的情况下(新意图发送)。 这里更多的信息 。
如果你还没有使用FLAG_ACTIVITY_SINGLE_TOP,那么就意味着,当通知被窃听,在这种情况下,意图必须有“STOP”参数中创建一个新的活动。 如果你能为我提供所有相关的代码,我可以帮你更好的。

第2部分:使用广播接收器这是不是直线前进,因为你已经发现了。 您将需要的onDestroy注销,如果您的活动被用户关闭时,的onDestroy可以称为你的广播接收器可以在时间不活动的通知是由用户点击。 如果不注销的话,那似乎是工作,但是这是一个内存泄漏,GC可以清理随时可能导致你的程序崩溃,即,您必须注销。 如果你需要去与广播接收器的方法,你需要有一个服务做到这一点,服务都有自己的缺陷 - >重启被系统,电池消耗等。我强烈建议你与你的第一种方法。



Answer 8:

我有一个非常类似的问题,而是一个非常不同的解决方案。 待定的意图,如果您已声明也不会触发<service android:enabled="false"></service>在manifest.xml文件。

从更换android:enabled="false" ,以android:enabled="true"

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



Answer 9:

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

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


文章来源: Android Notification Action is not fired (PendingIntent)