Android Notification invisible Action使用示例咨询及同应用调用疑问
关于Notification.Builder.addInvisibleAction的使用说明
同一应用内是否可用?
技术上可以在同一应用内使用addInvisibleAction,但这并非该API的核心设计场景。invisible action的主要用途是给监听系统通知的第三方应用(如辅助工具、自动化App)提供额外操作入口。如果是同一应用内的逻辑,直接通过常规通知PendingIntent或本地事件处理会更简洁,无需依赖不可见Action。
代码示例
1. 发送包含不可见Action的通知
import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import androidx.core.app.NotificationCompat; public class NotificationHelper { private static final String CHANNEL_ID = "invisible_action_channel"; private static final int NOTIFICATION_ID = 100; public static void sendNotificationWithInvisibleAction(Context context) { // 构建不可见Action的PendingIntent(这里用广播接收器举例) Intent actionIntent = new Intent(context, InvisibleActionReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, 1001, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT | (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0) ); // 创建不可见Action Notification.Action invisibleAction = new Notification.Action.Builder( R.drawable.ic_default, // 图标(系统不显示,但需传入合法资源) "Invisible Action", // 标题(系统不显示) pendingIntent ).build(); // 构建并发送通知 NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle("测试通知") .setContentText("包含不可见Action") .setPriority(NotificationCompat.PRIORITY_DEFAULT); // 仅在API 21及以上添加不可见Action if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder.addInvisibleAction(invisibleAction); } NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(NOTIFICATION_ID, builder.build()); } }
2. 接收不可见Action的广播接收器
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class InvisibleActionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 处理不可见Action触发后的逻辑 Toast.makeText(context, "不可见Action已触发", Toast.LENGTH_SHORT).show(); } }
3. 同一应用内监听并获取不可见Action(可选)
如果需要在同一应用内监听自己的通知并获取不可见Action,可通过NotificationListenerService实现(注意需用户授权):
import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.app.Notification; import java.util.List; public class MyNotificationListener extends NotificationListenerService { @Override public void onNotificationPosted(StatusBarNotification sbn) { super.onNotificationPosted(sbn); // 仅处理本应用的通知 if (getPackageName().equals(sbn.getPackageName())) { Notification notification = sbn.getNotification(); // 获取不可见Action列表 List<Notification.Action> invisibleActions = notification.getInvisibleActions(); if (invisibleActions != null && !invisibleActions.isEmpty()) { for (Notification.Action action : invisibleActions) { // 可触发Action的PendingIntent,或获取其信息 try { action.actionIntent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } } } } }
在Manifest中注册服务:
<service android:name=".MyNotificationListener" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>
内容的提问来源于stack exchange,提问作者Evgeniy Mishustin
相关产品推荐
相关产品推荐

