当前位置: 首页 > 面试题库 >

具有RemoteViews的Android通知-具有与RemoteViews布局相关联的活动

彭朝
2023-03-14
问题内容

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

到目前为止,我已经可以使用自定义布局xml
创建通知contentViewbigContentView指向RemoteView。但是,创建ActivityRemoteView内容时(与自定义布局相关联)不会启动。

我仔细检查了一下,在布局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

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...
}

谁能指出我所缺少的东西,或者如果我被误解了该怎么RemoteView办?我的理解是RemoteView,一旦创建,就应该调用与其布局关联的活动。或-我错过了一些API可以显式设置其意图的API
RemoteView吗?

到目前为止,我发现的只是设置内容Intent,基本上只在Activity用户触摸通知后启动。我正在寻找的是处理对自定义布局通知中的某些UI元素的触摸,而不是Activity不管用户在通知表面上的何处单击都启动。

例如,如果我ImageViewRemoteView通知中使用3个图标(即),则希望能够处理每个图标上的触摸。我无法想象这不可能,好像没有,RemoteView通知有什么意义?


问题答案:

您必须按如下所示关联setOnClickPendingIntent要从远程视图启动活动的活动…您可以在中设置任何布局ID
RemoteView以单击。

 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);

提供+id/layout_idRelativeLayout您使用。

如果用户单击通知时必须启动活动,则必须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个按钮,您必须使用创建自定义RemoteView并使用PendingIntent。一些事情如下…

这是我用于其中一个媒体播放器应用程序的自定义远程视图。它具有三个按钮,供处理程序单击。

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);
}
}


 类似资料:
  • 当我尝试为通知使用一些自定义布局时,我遇到了一个令人作呕的例外。我已经裁剪了图像和2个文本视图的通知,以方便解决方案的查找,但它仍然不会工作。所有类似问题的建议都于事无补((( 这是广播接收机的代码: 在Nexus4@4.4.4上测试

  • 我在Android中做了这类通知,但不知怎么得到了以下类型的异常。请帮我解决这个问题。我已经为rootview使用了height 64dp,这是通知的自定义视图。然后使用notificationCompat生成器中的setContent设置此自定义视图。

  • 我正在基于模板进行查看,但在某些区域我想输入片段。 模板:base。html 查看:列表。html 片段:片段/init.html 对于头部碎片,它可以正常工作。但在页脚中,但在页脚中,将显示模板的代码。 输出: 我希望你能帮助我。提前感谢。 使现代化 基础html 列表html init.html 输出: 我设法在页脚中包含代码片段,但我的目标是替换它。 解决方案:

  • 这个问题以前有人问过,但没有一个答案帮助我因此张贴我的案件。 我正在尝试使用布局文件构建自定义通知。但我得到以下错误: Android.app.RemoteServiceException:从包com.eswaraj.app.eswaraj发布的错误通知:无法展开以下内容的RemoteViews:StatusBarNotification(pkg=com.eswaraj.app.eswaraj u

  • 问题内容: 我希望能够发出通知,以提醒用户有关计时器已结束的信息,但是,当您单击通知时,我不希望有任何意图。 我已经尝试将null传递给意图 问题答案: 您可以传递参数 代替 上