通知中的 PendingIntent

2024-03-30

我想显示一个显示进度的通知 正在进行的操作。这对我来说效果很好。 但同时远程视图应包含取消按钮以停止正在进行的操作。通常的内容意图仍然应该做其他事情,即不取消正在进行的操作。看来我只能有一个意图。

我必须指定单击时启动的 contentIntent 通知:如果我不指定我会得到一些东西 线路:

E/ActivityManager(   62): Activity Manager Crash
E/ActivityManager(   62): java.lang.IllegalArgumentException: contentIntent required ...

对于“取消”按钮,我设置了另一个意图:

Intent cancelSyncIntent = new Intent("com.xyz.CANCEL_SYNC");
contentView.setOnClickPendingIntent(R.id.cancel_sync,
                                    PendingIntent.getBroadcast(context, 0,
                                    cancelSyncIntent, 0));

但这永远行不通。当按钮时我总是得到内容意图 被点击。看起来我无法在远程视图中使用按钮 通知?!

我可能会显示一条文字:“>”,但这似乎相当严厉。

更新:Afer J. 的建议:

    final Notification n = new Notification(R.drawable.gen_auto_notification_icon, context.getResources()
            .getString(
                    fastSyncOnly ? R.string.fast_synchronization_running_notification_title
                            : R.string.synchronization_running_notification_title), new Date().getTime());

    n.flags = Notification.FLAG_ONGOING_EVENT;

    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.in_progress_notification);
    n.contentView = contentView;

    // Intent cancelSyncIntent = new Intent("com.newsrob.CANCEL_SYNC");
    Intent cancelSyncIntent = new Intent();
    cancelSyncIntent.setClass(context, FireReceiver.class);
    PendingIntent pendingCancelSyncIntent = PendingIntent.getActivity(context, 0, cancelSyncIntent, 0);
    contentView.setOnClickPendingIntent(R.id.cancel_sync, pendingCancelSyncIntent);

    Intent showDashboardIntent = new Intent(context, DashboardListActivity.class);
    PendingIntent showDashboardPendingIntent = PendingIntent.getActivity(context, 0, showDashboardIntent, 0);
    n.contentIntent = showDashboardPendingIntent;

简短回答:通知视图中不能有可单击的子视图。

更长的答案...

我花了一天的时间试图让它也能工作,最终放弃并查看了 Android 源代码。看起来一切都发生在 StatusBarService.java 中的 makeNotificationView() 中。在那里,代码为通知下拉阴影中的每一行膨胀了一个名为“status_bar_latest_event”的布局。它从刚刚膨胀的名为“content”的视图中获取一个 ViewGroup,对其调用 setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS) ,然后将您的通知视图添加为该视图的子视图。因此,假设我了解 FOCUS_BLOCK_DESCENDANTS 的工作原理,那么您的视图或其任何子视图似乎没有希望获得焦点或单击事件。

我还遵循了与通知关联的主要 PendingEvent 如何工作的逻辑。托管通知视图的同一 ViewGroup 会调用 setOnClickListener() 来注册名为“Launcher”的侦听器类。当该类获取 onClick() 事件时,它只需调用与通知关联的 PendingIntent 上的 send() 方法。我希望点击的坐标可能会被传递,这样我至少可以尝试计算点击了哪个按钮,但没有这样的运气。

无论如何,如果有人知道解决这个问题的方法,我很乐意听到。现在,我只是拿出我的按钮并继续前进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通知中的 PendingIntent 的相关文章

随机推荐