studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones java android notifications android-activity remoteview

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