我想在我的应用程序是一个音乐播放器添加一个通知操作项目。 当流启动的通知应被触发并流的停止按钮应显示在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我认为一个教程..
我觉得在这个线程在谷歌代码解决方案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 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);
您可能需要更改请求代码和标志,如果需要
今天我就遇到了这个问题。 在我的情况下,它是使用缓存从意向的前一个实例意图演员作为所有参数pendingIntent
构造是一样的。 我发现这两种解决方案...
- 使用FLAG_CANCEL_CURRENT由提到尼克 。
传递一个独特requestCode
到pendingIntent
如下
PendingIntent pi = PendingIntent.getService(this, UNIQUE_ID, pi, 0);
就我而言,第二种方法解决了这个问题,因为我需要保留以前的通知活着。 可能这将有助于有人用类似的问题。
我今天就遇到了这个问题,它是由没有被注册或添加到AndroidManifest.xml中的活动引起的。 我原本以为它在那里,但事实并非如此。 此外,正在试图通过调用其意图的动作,记录没有错误。
我想通了这一点通过创建一个意图,然后在不使用的通知调用startAcitivty(意图)。 然后,它给了我一个错误,说明该活动很可能从清单丢失。
如果没有其他的答案解决您的问题,那么希望这将。 通常棘手的问题是一些简单的和愚蠢的结果。
超过使用广播接收器,你应该使用一个服务,并宣布在服务这样一个新的动作:
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
。
这应该做的伎俩;)
当它在后台,因为你是在在onPause注销你不接收广播。 移动unregisterReceiver代码的onDestroy功能。 这只会当活动被销毁被调用。 或者,你可以注销一旦发生预期的事件。
这里有多种问题:
第1部分:为什么你的意图没有收到“停止”多余的? 虽然它不是在代码中看到您所提供的,我想确认,如果你正在使用的标志为FLAG_ACTIVITY_SINGLE_TOP通知意图是什么? 如果是这样,您在活动收到的意图将是启动的活动,因此“STOP”的意图额外将不可用。 您将需要延长onNewIntent()
是这样的情况下(新意图发送)。 这里更多的信息 。
如果你还没有使用FLAG_ACTIVITY_SINGLE_TOP,那么就意味着,当通知被窃听,在这种情况下,意图必须有“STOP”参数中创建一个新的活动。 如果你能为我提供所有相关的代码,我可以帮你更好的。
第2部分:使用广播接收器这是不是直线前进,因为你已经发现了。 您将需要的onDestroy注销,如果您的活动被用户关闭时,的onDestroy可以称为你的广播接收器可以在时间不活动的通知是由用户点击。 如果不注销的话,那似乎是工作,但是这是一个内存泄漏,GC可以清理随时可能导致你的程序崩溃,即,您必须注销。 如果你需要去与广播接收器的方法,你需要有一个服务做到这一点,服务都有自己的缺陷 - >重启被系统,电池消耗等。我强烈建议你与你的第一种方法。
我有一个非常类似的问题,而是一个非常不同的解决方案。 待定的意图,如果您已声明也不会触发<service android:enabled="false"></service>
在manifest.xml文件。
从更换android:enabled="false"
,以android:enabled="true"
这可能不是问题的一个直接问题。 但是,如果你使用默认模板创建在Android Studio中的服务,它会自动将这些属性添加到该服务。
对我来说,解决办法是设置意图的标志:
resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK);