PendingIntent在Android O上不起作用 [英] PendingIntent is not working on Android O
问题描述
我的应用程序中有下载通知.我通过调用addAction()
方法将<取消>按钮添加到NotificationCompat.Builder
.但是按钮在Android O设备上不起作用.当我按下取消"按钮时,没有任何反应.但是在Android上运行的按钮<
I have download notification in my application. I've added "Cancel" button to NotificationCompat.Builder
by calling addAction()
method. But button not working on Android O device. When I press "Cancel" button nothing happens. But button working on Android < O.
我的Notification
:
NotificationCompat.Builder notification = new NotificationCompat.Builder(context, channelId)
.setContentTitle(title)
.setSmallIcon(R.drawable.network_download)
.setContentText(contentText)
.setOngoing(true)
.setContentIntent(null)
.addExtras(idBundle)
.addAction(R.drawable.cancel, context.getString(R.string.cancel), getCancelPendingIntent(context, id))
.setProgress(100, 30, true);
我的PendingIntent
:
private PendingIntent getCancelPendingIntent(Context context, int id){
return PendingIntent.getBroadcast(
context, id, new Intent("CANCEL_DOWNLOAD").putExtra("id", id), PendingIntent.FLAG_UPDATE_CURRENT);
}
我也有NotificationReceiver
:
public static class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("CANCEL_DOWNLOAD".equals(action) && context != null){
int id = intent.getIntExtra("id", -1);
NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (mgr != null)
mgr.cancel(id);
FtpManager.getInstance(new AppExecutors(), CredentialsManager.getInstance().getCredentials(context))
.cancelDownloading();
}
}
}
在Manifest
文件中,我有:
<receiver
android:name="eu.warble.pjapp.util.NotificationsManager$NotificationReceiver"
android:exported="false">
<intent-filter>
<action android:name="CANCEL_DOWNLOAD" />
</intent-filter>
</receiver>
推荐答案
从不在显式Intent
将要使用的情况下,请勿使用隐式Intent
. Android O通过禁止从清单注册的接收器接收隐式Intent
广播来帮助强制执行此操作.
Never use an implicit Intent
when an explicit Intent
will do. Android O helps enforce this by banning the receipt of implicit Intent
broadcasts from manifest-registered receivers.
步骤1:从<receiver>
中删除<intent-filter>
(这也意味着您可以摆脱android:exported="false"
,因为它现在是默认值)
Step #1: Remove the <intent-filter>
from your <receiver>
(which also means that you could get rid of android:exported="false"
, as that is now the default value)
步骤2:将new Intent("CANCEL_DOWNLOAD").putExtra("id", id)
替换为new Intent(context, NotificationReceiver.class).putExtra("id", id)
这篇关于PendingIntent在Android O上不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!