All
我编写一个服务来更新系统状态,并使用 startForeground 将服务置于前台,并向其添加通知。在通知中,我使用 remoteView 拥有三个图像和三个 OnClickPendingIntent。其中之一是发送回服务,并执行通知更新代码。
用于创建通知的代码:
Intent intentApp = new Intent(this,ScreenOffWidgetConfigure.class);
intentApp.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent piApp = PendingIntent.getActivity(this, 0, intentApp, 0);
Intent intentOnOff = new Intent(CV.SERVICE_INTENT_ACTION);
intentOnOff.putExtra(CV.SERVICEACTION, CV.SERVICEACTION_TOGGLE);
PendingIntent piOnOff = PendingIntent.getService(this, 0, intentOnOff, 0);
Intent intentScreenOff = new Intent(CV.SERVICE_INTENT_ACTION);
intentScreenOff.putExtra(CV.SERVICEACTION, CV.SERVICEACTION_SCREENOFF);
PendingIntent piScreenOff = PendingIntent.getService(this, 1, intentScreenOff, 0);
// setup remoteview
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_notification);
remoteViews.setOnClickPendingIntent(R.id.image_logo, piApp);
remoteViews.setOnClickPendingIntent(R.id.image_status, piOnOff);
remoteViews.setOnClickPendingIntent(R.id.image_screenoff, piScreenOff);
if(CV.getPrefChargingOn(this) && CV.isPlugged(this))
{
remoteViews.setImageViewResource(R.id.image_status,R.drawable.widget_charging_on);
}
else
{
if(CV.getPrefAutoOnoff(this))
remoteViews.setImageViewResource(R.id.image_status,R.drawable.widget_on);
else
remoteViews.setImageViewResource(R.id.image_status,R.drawable.widget_off);
}
// build the notification
Notification noti = new Notification.Builder(this)
.setContent(remoteViews)
.setSmallIcon(R.drawable.ic_launcher)
.setOngoing(true)
.build();
return noti;
收到意向后更新通知的代码:
Notification notify = createNotification();
final NotificationManager notificationManager = (NotificationManager) getApplicationContext()
.getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ONGOING, notify);
我的问题是:调用我的更新函数后,通知图像实际上发生了变化;但是,通知面板仍然存在!!它不会像启动活动时那样消失。
是否有我可以为通知、挂起意图设置的标志,或者在服务中收到意图后可以使用哪些 API 调用?
在其他地方找到我的问题答案:
1. 安卓:如何在安卓 4.2 上折叠状态栏?2. 防止状态栏扩展
首先,向 Android 清单添加使用权限行.xml
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
其次,使用以下代码使其工作:
try
{
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
if (Build.VERSION.SDK_INT <= 16)
{
Method collapse = statusbarManager.getMethod("collapse");
collapse.setAccessible(true);
collapse.invoke(service);
}
else
{
Method collapse2 = statusbarManager.getMethod("collapsePanels");
collapse2.setAccessible(true);
collapse2.invoke(service);
}
}catch(Exception ex){}
这很笨拙,但它确实有效。