android 点击Notification的定义视图后收起通知栏

百度搜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);
	},

输入法出BUG了,沙拉查词的锅? shift用不了、光标乱跳。暂时回到我的古董编辑器里写吧。

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

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

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

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

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

android 点击Notification的定义视图后收起通知栏_第1张图片




	

	
		

		

		

		
   


编写 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);

应该足够,不行的话再:

	
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);
	}
}

你可能感兴趣的:(安卓开发学习笔记,android,java,github)