我正在开发一个小部件,显示未接来电的数量、新短信的数量、新邮件的数量和任何通知的数量。就像下面的图片链接一样:
https://1drv.ms/i/s!AnNwF6LmB2gQi34jxc_11yB703l8
但是为了避免电池耗尽,是否可以仅在收到任何通知时更新小部件?或者我必须创建一个寻找通知的后台服务?
使用通知监听服务
这似乎是一个很好的解决方案(我正在使用 Xamarin)。
我有一个MainActivity.cs、一个AppWidget.cs和一个NotificationService.cs(用于NotificationListenerService)。
目前,我的小部件在我创建一个时更新一次,或者每 3000 万更新一次。我的 ListenerService 可以捕获通知发布或删除。
ListenerService 中的更新函数在捕获 post 或删除时被调用:
void UpdateWidget()
{
RemoteViews view = new RemoteViews(PackageName, Resource.Layout.Widget);
AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);
ComponentName thisWidget = new ComponentName(context.PackageName, Class.Name);
appWidgetManager.UpdateAppWidget(thisWidget, view);
}
在我的appwidget.cs中,我有这个功能:
public override void OnReceive(Context context, Intent intent)
{
switch (intent.Action)
{
default:
{
Log.Info("YotaWMNofifier", "** OnReceive received intent: {0}", intent.Action);
}
break;
case AppWidgetManager.ActionAppwidgetUpdate:
{
Log.Info("YotaWMNofifier", "** OnReceive received intent: Update widget");
WidgetUpdater(context);
}
break;
case AppWidgetManager.ActionAppwidgetDisabled:
{
Log.Info("YotaWMNofifier", "** OnReceive received intent: Delete last widget");
}
break;
case AppWidgetManager.ActionAppwidgetEnabled:
{
Log.Info("YotaWMNofifier", "** OnReceive received intent: Create widget");
WidgetUpdater(context);
}
break;
}
}
我从来没有从 OnReceive 函数中获得 Log.info,但我从服务的 OnNotificationRemoved 和 OnNotificationPosted 中获得了它。