Android notification with RemoteViews - активность, связанная с макетом RemoteViews

я изучал, как создать уведомление о пользовательском макете с помощью RemoteView.

до сих пор я могу создать уведомление с contentView и bigContentView указывать RemoteView с пользовательским макетом xml. Однако, чего не происходит, так это иметь 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>

In файл манифеста, сразу после основного действия основного приложения, также добавляется действие уведомления:

<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, который я пропустил, который явно может установить намерение RemoteView?

то, что я нашел до сих пор, только настройки контент Intent который в основном просто запускает Activity как только пользователь касается уведомления. То, что я ищу, - это обрабатывать прикосновения к некоторым элементам UI внутри уведомление о пользовательском макете, а не для запуска Activity независимо от того, где пользователь нажимает на поверхность уведомления.

например, если у меня есть 3 значка (т. е. ImageView) в RemoteView какое уведомление использует, я хотел бы иметь возможность обрабатывать прикосновение к каждому из них. Я не могу себе представить, что это было бы невозможно, как будто это не так, какой смысл иметь RemoteView В уведомления?

2 ответов


вы должны связать мысль деятельности setOnClickPendingIntent чтобы запустить действие с удаленного просмотра, как показано ниже...Вы можете установить любой макет в 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_id до RelativeLayout вашего использования.

если вы должны запустить действие, когда пользователь нажимает на уведомление, то вы должны использовать PendingIntent as....

    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. некоторые вещи, как под...

вот пользовательский удаленный вид, который я использую для одного из моих приложений media player. он имеет три кнопки для нажатия обработчика.

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 на уведомления.Строитель!--4--> такой:

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 будет запущен.