百度搜setOnClickPendingIntent 收起通知栏,结果前排的csdn、博客园文章都是无效的(用了反射)。最终在Stack Overflow上找到了解决方案,记录如下:

方法很简单,实际内容只有一行:
参考Android notification tray does not collapse after clicking ongoing notification - Stack Overflow

private void collapseStatusBar(Context context) {
	context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}		

至于ACTION_CLOSE_SYSTEM_DIALOGS的具体含义有待探究。

附加,service notification 写法。原生按钮只能有三个,太少。一个service对应多个通知的话,配置麻烦,使用需展开多层,殊为不便。只能用自定义视图。

(setCustomContentView & RemoteViews)

service

	public int onStartCommand(Intent intent, int flags, int startId) {
		if(intent!=null) {
			if(...) {
				...
				collapseStatusBar(this);
			}
		}
	}
		
	// 预先创建RemoteViews  rv = ...
	RemoteViews rv = new RemoteViews (getPackageName(), R.layout.noti);
	// channel 略
	Notification.Builder builder = new Notification.Builder(this)
			.setSmallIcon(R.mipmap.ic_launcher)
			.setContentTitle("实用工具")
			.setPriority(Notification.PRIORITY_HIGH)
			.setCustomContentView(rv)
			.setCustomBigContentView(rv)


	{
		Intent settingsIntent = new Intent(this, ServiceEnhancer.class);
		settingsIntent.putExtra("haha", true);
		PendingIntent pendingIntent = PendingIntent.getService(this, 0, settingsIntent, FLAG_UPDATE_);
		 //原生按钮,上限三个,使用rv后无效。
		builder.addAction(R.drawable.ic_close_noti_action, "魔法", pendingIntent);
		// 对应的rv点击事件处理法
		rv.setOnClickPendingIntent(R.id.haha, pendingIntent);
	},

另外,更正上面个错误,也是抄来的、存在着问题。

参考Android通知:使用多个setOnClickPendingIntent时的错误

对于所有的Pendingintent,相同的请求代码0会导致所有的按钮都绑定到最后一个Pendingintent。你应该针对不同的PendingIntent使用不同REQUEST_CODE,比如可以用视图id:

	PendingIntent.getService(this, R.id.haha, settingsIntent, FLAG_UPDATE_);

这样,每个按钮都可绑定不同的响应代码,并各自选择是否收起通知面板。

请添加图片描述

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:padding="5dp">

	<TextView
		android:id="@android:id/text1"
		android:layout_width="match_parent"
		android:layout_height="45dp"
		android:textColor="#000"
		android:textSize="19sp"
		android:text="实用工具"
		android:layout_marginLeft="15dp"
		android:layout_marginRight="8dp"
		android:paddingTop="7dp"
		/>

	<LinearLayout
	   android:layout_width="match_parent"
	   android:layout_height="wrap_content"
	   android:paddingTop="45dp"
	   android:paddingStart="0dp"
	   >
		<TextView
			android:id="@+id/haha"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textColor="#3f3f3f"
			android:text="魔法"
			android:layout_marginLeft="15dp"
			android:layout_marginRight="8dp"
			android:clickable="true"
			android:textAppearance="@style/TextAppearance.Compat.Notification.Title"
			/>

		<TextView
			android:id="@+id/save"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textColor="#3f3f3f"
			android:text="保存一个"
			android:layout_marginLeft="8dp"
			android:layout_marginRight="8dp"
			android:textAppearance="@style/TextAppearance.Compat.Notification.Title"
			/>

		<TextView
			android:id="@+id/delete"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textColor="#3f3f3f"
			android:text="删除一个"
			android:layout_marginLeft="8dp"
			android:layout_marginRight="8dp"
			android:textAppearance="@style/TextAppearance.Compat.Notification.Title"
			/>

		<TextView
			android:id="@+id/deleteAll"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textColor="#3f3f3f"
			android:text="删除全部"
			android:layout_marginLeft="8dp"
			android:layout_marginRight="8dp"
			android:textAppearance="@style/TextAppearance.Compat.Notification.Title"
			/>
   </LinearLayout>

</RelativeLayout>

编写 xml 稍微有点麻烦了,若样式、drawable等分开的话更加不易于交流。可以理解flutter或compose的做法:纯代码编写视图确实会更容易分享和复用代码。

service 弹出dialog 总结 ( TYPE_APPLICATION_OVERLAY )

AlertDialog d = new AlertDialog.Builder(this)
		.setTitle("确认删除全部?")
		.setNegativeButton("取消", null)
		.setPositiveButton("确认", (dialog, which) -> PasteTask.delete(this, false))
		.create();
d.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
d.show();
collapseStatusBar(this);

应该足够,不行的话再:

	<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
	if (! Settings.canDrawOverlays(MainActivity.this)) {
		startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
				Uri.parse("package:" + getPackageName())),10);
	}
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐