android 点击Notification的定义视图后收起通知栏
百度搜`setOnClickPendingIntent 收起通知栏`,结果前排的csdn、博客园文章都是无效的(用了反射)。最终在Stack Overflow上找到了解决方案,记录如下。方法很简单,实际内容只有一行:…
·
百度搜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);
}
}
更多推荐
已为社区贡献10条内容
所有评论(0)