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_);
这样,每个按钮都可绑定不同的响应代码,并各自选择是否收起通知面板。
编写 xml 稍微有点麻烦了,若样式、drawable等分开的话更加不易于交流。可以理解flutter或compose的做法:纯代码编写视图确实会更容易分享和复用代码。
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);
}
}