java - programacion - manual android studio avanzado
NotificaciĆ³n de Android con RemoteViews: tener actividad asociada con el diseƱo de RemoteViews (2)
Todo lo que necesita hacer es agregar setContentIntent
a su Notification.Builder así:
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);
Ahora, cuando haces clic en tu notificación, se iniciará YourLanchedActivity .
He estado investigando sobre cómo crear notificaciones de diseño personalizado usando RemoteView
.
Hasta ahora, puedo crear una notificación con contentView
y bigContentView
apuntando a una vista RemoteView
con un diseño personalizado xml. Sin embargo, lo que no sucede es tener Activity
(asociada con el diseño personalizado) iniciada cuando se crea esta vista RemoteView
.
Lo he comprobado dos veces y en mi diseño xml, parece tener el nombre correcto de clase de 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>
En el archivo de manifiesto, justo después de la actividad principal de la aplicación principal, también se agrega actividad de notificación:
<activity
android:name=".LLMNotificationActivity"
android:label="@string/app_name">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Me gustaría esperar que cuando la notificación utiliza RemoteView
para su contenido, esta RemoteView
inicie la actividad que está asociada a su definición de diseño. Sin embargo, parece que no.
Así es como creo una notificación en la actividad principal de la aplicación:
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
clase de actividad LLMNotificationActivity
se define como de costumbre:
public class LLMNotificationActivity extends Activity {
.... etc.... constructor, some button on-click handlers, nothing spectacular...
}
¿Alguien puede señalarme lo que me falta o si he entendido mal lo que RemoteView
puede hacer? RemoteView
, RemoteView
debería, una vez creado, invocar la actividad asociada a su diseño. O bien, ¿hay alguna API que haya omitido que explícitamente pueda establecer el intento de RemoteView
?
Lo que he encontrado hasta ahora es solo configurar contenido de Intent
que básicamente solo inicia una Activity
una vez que el usuario toca la notificación. Lo que estoy buscando es manejar los toques a algunos de los elementos de la interfaz de usuario dentro de la notificación de diseño personalizado, no para iniciar una Activity
independientemente de dónde el usuario haga clic en la superficie de notificación.
Por ejemplo, si tengo 3 íconos (es decir, ImageView
) en una vista RemoteView
que usa la notificación, me gustaría poder manejarlos en cada uno de ellos. No me puedo imaginar que esto no sea posible, como si no fuera así, ¿de qué RemoteView
tener RemoteView
en la notificación?
setOnClickPendingIntent
asociar la actividad pensada setOnClickPendingIntent
para iniciar la actividad desde la vista remota como se muestra a continuación ... Puede establecer cualquier ID de diseño en RemoteView
para hacer clic.
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);
proporcione un +id/layout_id
a RelativeLayout
su uso.
Si tiene que iniciar la actividad cuando el usuario hace clic en la notificación, debe usar PendingIntent
como ....
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());
Para 3 botones, debe usar crear una vista RemoteView
personalizada y usar PendingIntent
. algo como abajo ...
Aquí está la vista remota personalizada que estoy usando para una de mi aplicación de reproductor multimedia. tiene tres botones para hacer clic en el controlador.
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);
}
}