如何更新与RemoteViews通知? [英] How to update Notification with RemoteViews?
问题描述
我要创建与 RemoteViews
的通知从一个自定义的服务,这是与通知在前台模式下运行(即,服务会一直保持活跃的通知是可见的用户)。通知被设置为持续让用户无法刷卡而过。
I'm creating a notification with RemoteViews
from a custom Service, which is running with notification in a foreground mode (that is, service will remain active as long as notification is visible to user). Notification is set as Ongoing so user cannot swipe it off.
我想更改为的ImageView
,其中包含了远程视图的布局或更改文本值的TextView $所示例子位图C $ C>。布局远程视图设置与
XML
布局文件。
I'd like to change for example bitmap shown in ImageView
, contained within remote view's layout or change text value in a TextView
. Layout in remote view is set with xml
layout file.
我的问题是,一旦通知,是创建和可见的用户,如果我叫任 RemoteViews
中的功能,如 setImageViewResource
来改变一个 ImageView的显示位图
,变化是不可见的,除非以后我也叫 setImageViewResource
我打电话算账:
My problem is that once notification is created and visible to user, if I call any of RemoteViews
's functions like setImageViewResource
to change Bitmap shown in an ImageView
, change is not visible, unless after I do call setImageViewResource
I call afterwards:
NotificationManager.notify( id, notification );
或
Service.startForeground(id,notification);
这听起来是不是我的权利,虽然。我不能相信,更新 RemoteViews
UI在已创建的通知,我不得不重新初始化通知。如果我有按钮
的通知控制,它更新自己的触摸和释放。因此,有一定有办法妥善做到这一点,但我不知道怎么办。
This doesn't sound right to me though. I can't believe that to update RemoteViews
UI in notification that is already created, I have to re-initialize notification. If I have Button
control in notification, it updates itself on touch and release. So there's gotta be a way to do this properly, but I don't know how.
下面是我的code创造通知我服务
实例中:
Here is my code which creates notification inside my Service
instance:
this.notiRemoteViews = new MyRemoteViews(this,this.getApplicationContext().getPackageName(),R.layout.activity_noti1);
Notification.Builder notibuilder = new Notification.Builder(this.getApplicationContext());
notibuilder.setContentTitle("Test");
notibuilder.setContentText("test");
notibuilder.setSmallIcon(R.drawable.icon2);
notibuilder.setOngoing(true);
this.manager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
this.noti = notibuilder.build();
this.noti.contentView = this.notiRemoteViews;
this.noti.bigContentView = this.notiRemoteViews;
this.startForeground(NOTIFICATION_ID, this.noti);
和功能势力用户界面的变化通知:
And function that 'forces' UI changes to notification:
public void updateNotiUI(){
this.startForeground(NOTIFICATION_ID, this.noti);
}
在 MyRemoteViews
类,需要的时候,我这样做是为了更改用户界面:
Within MyRemoteViews
class, when required, I do this to make changes to UI:
this.setImageViewResource(R.id.iconOFF, R.drawable.icon_off2);
this.ptMyService.updateNotiUI();
谁能告诉我什么是通知更新 RemoteViews
的UI组件的正确方法是什么?
Can anyone tell me what is the correct way of updating UI components of a RemoteViews
in notification?
推荐答案
下面是为您更新到 RemoteViews
的通知(本例中的类发生了一个详细的例子扩展服务
,您可以在活动中使用它,的BroadcastReceiver
,而在其他Android组件):
Here's a detail example for you to update the notification through RemoteViews
(this example took place in a class that extends Service
, you can use it in activity, BroadcastReceiver
, and in other Android components):
private static final int NOTIF_ID = 1234;
private NotificationCompat.Builder mBuilder;
private NotificationManager mNotificationManager;
private RemoteViews mRemoteViews;
private Notification mNotification;
...
@SuppressWarnings("deprecation")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// setup the notification first
setUpNotification();
/* For example, you want to update notification after 5 seconds.
Then, you call below method to update it:
updateNotification(); */
return START_STICKY;
}
private void setUpNotification(){
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// we need to build a basic notification first, then update it
Intent intentNotif = new Intent(this, MainActivity.class);
intentNotif.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intentNotif, PendingIntent.FLAG_UPDATE_CURRENT);
// notification's layout
mRemoteViews = new RemoteViews(getPackageName(), R.layout.custom_notification_small);
// notification's icon
mRemoteViews.setImageViewResource(R.id.notif_icon, R.drawable.ic_launcher);
// notification's title
mRemoteViews.setTextViewText(R.id.notif_title, getResources().getString(R.string.app_name));
// notification's content
mRemoteViews.setTextViewText(R.id.notif_content, getResources().getString(R.string.content_text));
mBuilder = new NotificationCompat.Builder(this);
CharSequence ticker = getResources().getString(R.string.ticker_text);
int apiVersion = Build.VERSION.SDK_INT;
if (apiVersion < VERSION_CODES.HONEYCOMB) {
mNotification = new Notification(R.drawable.ic_launcher, ticker, System.currentTimeMillis());
mNotification.contentView = mRemoteViews;
mNotification.contentIntent = pendIntent;
mNotification.flags |= Notification.FLAG_NO_CLEAR; //Do not clear the notification
mNotification.defaults |= Notification.DEFAULT_LIGHTS;
// starting service with notification in foreground mode
startForeground(NOTIF_ID, mNotification);
}else if (apiVersion >= VERSION_CODES.HONEYCOMB) {
mBuilder.setSmallIcon(R.drawable.ic_launcher)
.setAutoCancel(false)
.setOngoing(true)
.setContentIntent(pendIntent)
.setContent(mRemoteViews)
.setTicker(ticker);
// starting service with notification in foreground mode
startForeground(NOTIF_ID, mBuilder.build());
}
}
// use this method to update the Notification's UI
private void updateNotification(){
int api = Build.VERSION.SDK_INT;
// update the icon
mRemoteViews.setImageViewResource(R.id.notif_icon, R.drawable.icon_off2);
// update the title
mRemoteViews.setTextViewText(R.id.notif_title, getResources().getString(R.string.new_title));
// update the content
mRemoteViews.setTextViewText(R.id.notif_content, getResources().getString(R.string.new_content_text));
// update the notification
if (api < VERSION_CODES.HONEYCOMB) {
mNotificationManager.notify(NOTIF_ID, mNotification);
}else if (api >= VERSION_CODES.HONEYCOMB) {
mNotificationManager.notify(NOTIF_ID, mBuilder.build());
}
}
布局的通知,即 RES /布局/ custom_notification_small.xml
:
<!-- We have to set the height to 64dp, this is the rule of the small notification -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="64dp"
android:orientation="horizontal"
android:id="@+id/notif_small"
android:background="@drawable/notification_background">
<ImageView
android:id="@+id/notif_icon"
android:contentDescription="@string/notif_small_desc"
android:layout_width="47dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_launcher"
android:layout_marginLeft="7dp"
android:layout_marginRight="9dp"/>
<TextView
android:id="@+id/notif_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/notif_icon"
android:singleLine="true"
android:paddingTop="8dp"
android:textSize="17sp"
android:textStyle="bold"
android:textColor="#000000"
android:text="@string/app_name"/>
<TextView
android:id="@+id/notif_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/notif_icon"
android:paddingBottom="9dp"
android:layout_alignParentBottom="true"
android:singleLine="true"
android:textSize="13sp"
android:textColor="#575757"
android:text="Content" />
</RelativeLayout>
希望这个例子可以帮助你很多!
Hope this example helps you a lot!
注:您无法更新pre-蜂窝定制 NotificationCompat
,所以我加在pre-蜂窝更新它的另一种方式,即先检查API级别,并使用日precated 通知
代替。
NOTE: You can't update the custom NotificationCompat
on pre-Honeycomb, so I added an alternative way to update it on pre-Honeycomb, i.e. checking the API level first and use the deprecated Notification
instead.
这篇关于如何更新与RemoteViews通知?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!