Android通知addAction未启动广播

时间:2016-08-24 23:54:15

标签: android android-intent notifications broadcastreceiver action

创建通知:

PendingIntent pIntent = PendingIntent.getActivity(context, (int) taskId, intent, 0);
intent.setAction(Utils.MARK_AS_DONE);

PendingIntent pIntentMarkAsDone = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
        .setTicker(ticker)
        .setContentTitle(title)
        .setContentText(description)
        .setSmallIcon(getAlarmIcon(type))
        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
        .setContentIntent(pIntent)
        .addAction(0, context.getString(R.string.mark_as_done), pIntentMarkAsDone);

Notification notification = builder.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify((int) taskId, notification);

我使用getBroadcast的挂起意图添加了添加。

接收器:

public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Log to check
    }
}

这堂课应该"收到"那个行动。我还添加了Manifest

清单:

<receiver android:name=".NotificationReceiver">
    <intent-filter>
        <action android:name="<package_name>.MARK_AS_DONE"/>
    </intent-filter>
</receiver>

嗯,onReceive没有收到。我做错了什么?

1 个答案:

答案 0 :(得分:1)

TL; DR:创建一个新的Intent,而不是重用intent中的<intent-filter>,并从<receiver>中删除PendingIntent pIntent = PendingIntent.getActivity(context, (int) taskId, intent, 0);

你的第一行是:

intent

这意味着new Intent(context, YourActivityClass.class)标识了某些活动。如果您是通过ComponentName创建的,则会在其中设置setAction(),以识别您的活动。

然后,您在intent上致电getBroadcast()并将其与intent一起使用。但是,除了设置(或替换)操作之外,ComponentName中的所有其他内容都与原来的相同。特别是,识别活动的ComponentName仍然存在。因此,当发送广播时,Android无法传送,因为组件无效(活动无法直接接收广播),并且操作字符串被忽略(因为Intent设置Intent动作和类别之类的东西不再用于路由)。

所以,我建议您创建两个Intent个对象,一个用于活动,一个用于接收器。

请注意,您不需要接收器的操作字符串。您可以使用显式new Intent(context, NotificationReceiver.class)构造函数(<intent-filter>)。实际上,在接收器上使用操作字符串对安全性有害,因为现在任何应用程序都可以向您发送该广播。因此,我建议删除Intent并使用明确的PendingIntent来制作广播jQuery( document ).ready(function( $ ) { $('.orange-cell, .green-cell, .purple-cell, .white-cell').hover(function() { var colorClass = $(this).attr('class').split(' ')[1]; $("."+colorClass ).addClass('z-relative'); $('#darkness').fadeTo(200, 1); },function() {var colorClass = $(this).attr('class').split(' ')[1]; $("."+colorClass ).removeClass('z-relative'); $('#darkness').fadeTo(200, 0, function(){ $(this).hide(); }); }); });