【问题标题】:BroadcastReceiver.onReceive not called, but Activity.onNewIntent do. Why?BroadcastReceiver.onReceive 没有被调用,但是 Activity.onNewIntent 被调用了。为什么?
【发布时间】:2019-03-22 16:43:52
【问题描述】:

我正在尝试从我的通知中获取“DeleteIntent”回调。 BroadcastReceiver.onReceive 不是从 PendengIntent 调用的,而当使用 sendBroadcast(deleteIntent) 手动启动广播时它可以正常工作。

intent 目标为 Activity(命中 Activity.onNewIntent)时效果很好,但使用它很奇怪,因为当消息关闭时 Activity 进入前台。

请帮助onReceive调用BroadcastReceiver。 它是可见的、导出的和启用的,位于同一个包中。

MyCancelReceiver 类

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

Android 清单

<activity android:name=".MainActivity" android:launchMode="singleTask">

<MyCancelReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="notification_cancelled"/>
    </intent-filter>
</receiver>

MainActivity

private MyCancelReceiver mReceiver;

@Override
public void onStart() {
    super.onStart();

    IntentFilter filter = new IntentFilter();
    filter.addAction("notification_cancelled");
    mReceiver = new MyCancelReceiver();
    registerReceiver(mReceiver, filter);
}

@Override
public void onStop() {
    super.onStop();       
    unregisterReceiver(mReceiver);
}

通知创建:

Intent cancelIntent = new Intent(getApplicationContext(), MyCancelReceiver.class);
cancelIntent.setAction("notification_cancelled");
cancelIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent deleteIntent = PendingIntent.getActivity(getApplicationContext(), 0, cancelIntent, PendingIntent.FLAG_CANCEL_CURRENT);

Notification not = new Notification.Builder(getApplicationContext(), Util.ANDROID_CHANNEL_ID)
        .setContentTitle(messageTitle)
        .setContentText(messageBody)
        .setSmallIcon(R.drawable.default)
        .setAutoCancel(true)
        .setDeleteIntent(deleteIntent)
        .setContentIntent(contentIntent)
        .build();

NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, not);

提前谢谢你。

【问题讨论】:

    标签: java android notifications broadcastreceiver


    【解决方案1】:

    这是因为当你开始你的活动时,onStart() 会被调用,并且你会在活动启动后立即在 onReceive() 中得到一个回调。但是当您单击通知时,不会调用 onStart,因为活动已经创建,在这种情况下,不会调用 onStart。尝试在 onResume() 中注册,我很确定它会起作用。

    【讨论】:

    • 谢谢。但正如我所见,BroadcastReceiver 配置正确。当使用 sendBroadcast 手动启动广播时,它可以正常工作。
    • 我不认为现有的广播接收器有任何问题,您只需要在正确的地方注册,同时点击通知,如果 onNewIntent 被调用,然后也在那里注册。
    【解决方案2】:

    使用此线程Click on android notification icon does not trigger broadcast receiver的答案解决了问题

    显式意图替换为隐式意图。 意图 cancelIntent = new Intent("notification_canceled");

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多