带有RemoteViews的Android通知 – 具有与RemoteViews布局相关的活动

我一直在研究如何使用RemoteView创build自定义布局通知

到目前为止,我能够通过contentViewbigContentView创build一个通知,指向具有自定义布局xml的RemoteView 。 但是,什么也没有发生,就是当这个RemoteView被创build时,启动Activity (与自定义布局相关)。

我已经仔细检查,并在我的布局xml,它似乎有正确的Activity类名称:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="0dp" android:paddingLeft="0dp" android:paddingRight="0dp" android:paddingTop="0dp" tools:context=".LLMNotificationActivity" > ..... the rest are standard layout items: images, buttons and text </RelativeLayout> 

在清单文件中,在主应用程序主要活动之后,还添加了通知活动:

 <activity android:name=".LLMNotificationActivity" android:label="@string/app_name"> <intent-filter> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

我希望当通知使用RemoteView作为其内容时,这个RemoteView将启动连接到其布局定义的活动。 但是它似乎没有。

这里是我如何在主应用程序Activity创build通知:

 protected void startNoti() { if( noti!=null ) return; Context context = getApplicationContext(); RemoteViews contentView = new RemoteViews(context.getPackageName(),R.layout.activity_noti1); Notification.Builder notibuilder = new Notification.Builder(context); notibuilder.setContentTitle(" "); notibuilder.setContentText(" "); notibuilder.setSmallIcon(R.drawable.ic_launcher); notibuilder.setOngoing(true); manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); noti = notibuilder.build(); noti.contentView = contentView; manager.notify(NOTIFICATION_ID, noti); } 

LLMNotificationActivity活动类的定义如常:

 public class LLMNotificationActivity extends Activity { .... etc.... constructor, some button on-click handlers, nothing spectacular... } 

任何人都可以指向我缺less什么,或者如果我误解了RemoteView可以做什么? 我的理解是, RemoteView应该在创build之后调用与其布局相关的活动。 或者 – 有一些API我错过了,明确可以设置RemoteView意图?

到目前为止,我发现的仅仅是设置内容Intent ,一旦用户触及通知,基本上只会启动一个Activity 。 我正在寻找的是处理自定义布局通知中的一些UI元素,而不是启动一个Activity无论用户点击通知表面。

例如,如果我在通知使用的RemoteView有3个图标(即ImageView ),我希望能够处理它们中的每一个。 我无法想象这是不可能的,因为如果不是这样,通知RemoteView有什么意义?

Solutions Collecting From Web of "带有RemoteViews的Android通知 – 具有与RemoteViews布局相关的活动"

您必须关联活动思考setOnClickPendingIntent从远程视图启动活动如下…您可以在RemoteView设置任何布局ID来单击。

  Intent intent = new Intent(context, YourActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); RemoteViews removeWidget = new RemoteViews(context.getPackageName(), R.layout.your_layout); removeWidget.setOnClickPendingIntent(R.id.layout_id, pendingIntent); 

为您使用的RelativeLayout提供一个+id/layout_id

如果必须在用户单击通知时启动活动,则必须使用PendingIntent作为….

  NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("title") .setContent(mRemoteControl); Intent notificationIntent = new Intent(this, YourActivity.class); PendingIntent contentIntent = PendingIntent.getActivity( this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(contentIntent); mNM.notify(1000,mBuilder.build()); 

对于3个button,您必须使用创build自定义RemoteView并使用PendingIntent 。 有些事情如下…

这里是我用于我的媒体播放器应用程序之一的自定义远程视图。 它有三个button来处理点击。

 public class RemoveControlWidget extends RemoteViews { private final Context mContext; public static final String ACTION_PLAY = "com.mediabook.app.ACTION_PLAY"; public static final String ACTION_PREVIOUS = "com.mediabook.app.ACTION_PREVIOUS"; public static final String ACTION_NEXT = "com.mediabook.app.ACTION_NEXT"; public RemoveControlWidget(Context context , String packageName, int layoutId) { super(packageName, layoutId); mContext = context; Intent intent = new Intent(ACTION_PLAY); PendingIntent pendingIntent = PendingIntent.getService(mContext.getApplicationContext(),100, intent,PendingIntent.FLAG_UPDATE_CURRENT); setOnClickPendingIntent(R.id.play_control,pendingIntent); setOnClickPendingIntent(R.id.pause_control,pendingIntent); intent = new Intent(ACTION_PREVIOUS); pendingIntent = PendingIntent.getService(mContext.getApplicationContext(),101, intent,PendingIntent.FLAG_UPDATE_CURRENT); setOnClickPendingIntent(R.id.previous_control,pendingIntent); intent = new Intent(ACTION_NEXT); pendingIntent = PendingIntent.getService(mContext.getApplicationContext(),102, intent,PendingIntent.FLAG_UPDATE_CURRENT); setOnClickPendingIntent(R.id.next_control,pendingIntent); } } 

所有你需要做的就是像这样添加setContentIntent到你的Notification.Builder

 Intent i = new Intent(context, YourLaunchedActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); Notification.Builder notibuilder = new Notification.Builder(context); notibuilder.setContentIntent(pendingIntent); 

现在,当您点击您的通知时, YourLanchedActivity将会启动。