从今天早上开始,我正在努力解决这个问题(至少对我来说这是一个问题) 我的场景如下: 我构建了一个正在侦听MQTT主题的Android后台服务。当此服务收到MQTT消息时,它会为该用户创建通知。 我的服务能够监听和接收MQTT消息。我无法做的是显示我自己的通知布局并单击通知以查看通知详细信息 我使用以下软件版本:
在我的服务中,当我建立与mqttTopic的连接时,我使用自己的接口org.eclipse.paho.client.mqttv3.MqttCallback实现
我将接收到mqtt消息的服务实例传递给此接口。 在回调中,我想通过使用自己的布局来创建通知 这是我写的代码:
涉及的方法(currentService是服务实例)
private void notifyUser(Allarme amp) {
RemoteViews remoteView = new RemoteViews(currentService.getPackageName(), R.layout.activity_visualizza_notifica);
Intent notificationIntent = new Intent(currentService, VisualizzaNotificaActivity.class);
notificationIntent.putExtra(IConstants.NOTIFICA_DATA, amp);
PendingIntent contentIntent = PendingIntent.getActivity(currentService, (int)System.currentTimeMillis(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(currentService);
builder.setSmallIcon(R.mipmap.warning);
builder.setWhen(System.currentTimeMillis());
builder.setOngoing(false);
builder.setAutoCancel(false);
builder.setTicker(currentService.getString(R.string.notifica_ticker));
builder.setContentIntent(contentIntent);
builder.setContent(remoteView);
builder.setDefaults(Notification.DEFAULT_VIBRATE);
builder.setDefaults(Notification.DEFAULT_SOUND);
remoteView.setTextViewText(R.id.data_notifica_text_id, DateUtil.formatMillisDate(amp.getDataNotifica()));
remoteView.setTextViewText(R.id.data_ricezione_notifica_text_id, DateUtil.formatMillisDate(amp.getDataRicezioneNotifica()));
TipoAllarme tmp = amp.getTipoAllarme();
if (tmp != null) {
String tipoNotifica = tmp.getCodiceAllarme() + " - " + tmp.getDescrizioneAllarme();
remoteView.setTextViewText(R.id.tipo_notifica_text_id, tipoNotifica);
}
remoteView.setTextViewText(R.id.descrizione_notifica_text_id, amp.getDescrizioneAllarme());
Notification notification = builder.build();
nm.notify(IConstants.MQTT_NEW_NOTIFICATION_ARRIVED, notification);
}
activity_visualizza_notifica.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_visualizza_notifica_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/data_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="Ciao dalla notifica"
android:layout_toLeftOf="@+id/data_ricezione_notifica_text_id"
android:layout_toStartOf="@+id/data_ricezione_notifica_text_id"
android:ems="10" />
<TextView
android:id="@+id/data_ricezione_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:ems="10" />
<TextView
android:id="@+id/tipo_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/descrizione_notifica_text_id"
android:ems="10" />
<TextView
android:id="@+id/descrizione_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/data_notifica_text_id"
android:ems="10" />
</RelativeLayout>
VisualizzaNotificaActivity.java
public class VisualizzaNotificaActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
View theView = findViewById(R.id.id_dettaglio_notifica);
Allarme amp = (Allarme) getIntent().getExtras().get(IConstants.NOTIFICA_DATA);
TextView dataNotifica = (TextView) findViewById(R.id.dettaglio_data_notifica_text_id);
dataNotifica.setText(DateUtil.formatMillisDate(amp.getDataAllarme()));
TextView dataRicezioneNotifica = (TextView) findViewById(R.id.dettaglio_data_ricezione_notifica_text_id);
dataRicezioneNotifica.setText(DateUtil.formatMillisDate(amp.getDataRicezioneAllarme()));
TextView descrizione = (TextView) findViewById(R.id.dettaglio_descrizione_notifica_text_id);
descrizione.setText(amp.getDescrizioneAllarme());
TipoAllarmeMercePericolosa tamp = amp.getTipoAllarme();
if (tamp != null) {
TextView tipoAllarme = (TextView) findViewById(R.id.dettaglio_tipo_notifica_text_id);
tipoAllarme.setText(tamp.getCodiceAllarme() + " - " + tamp.getDescrizioneAllarme());
}
setContentView(theView);
super.onCreate(savedInstanceState);
}
}
dettaglio_notifica.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/id_dettaglio_notifica"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/dettaglio_data_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="Ciao dalla notifica"
android:layout_toLeftOf="@+id/dettaglio_data_ricezione_notifica_text_id"
android:layout_toStartOf="@+id/dettaglio_data_ricezione_notifica_text_id"
android:ems="10" />
<TextView
android:id="@+id/dettaglio_data_ricezione_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:ems="10" />
<TextView
android:id="@+id/dettaglio_tipo_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/dettaglio_descrizione_notifica_text_id"
android:ems="10" />
<TextView
android:id="@+id/dettaglio_descrizione_notifica_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/dettaglio_data_notifica_text_id"
android:ems="10" />
</RelativeLayout>
通过执行此代码,我能够生成通知,但是:
我没有显示自己的通知布局;我看到一个完全空白的通知
当我点击通知时,会调用VisualizzaNotificaActivity但在onCreate方法中,当我调用View theView = findViewById(R.id.id_dettaglio_notifica);
时,它总是返回null
也许我错过了什么......但我无法找到我失踪的东西...... 收到mqtt消息后,如何显示自己的通知布局?我在VisualizzaNotificaActivity中得到了null吗?
谢谢 安吉洛
编辑:使用BroadcastReceiver更改实施
我使用BroadcasterReceiver改变了我的服务实现 基本上我写了这个接收器:
public class AllarmiMerciPericoloseReceiver extends BroadcastReceiver {
private static final String TAG_LOG = AllarmiMerciPericoloseReceiver.class.getSimpleName();
public AllarmiMerciPericoloseReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
try
{
if( intent.getAction().equals(IConstants.MQTT_MSG_RECEIVED_MSG) )
{
AllarmeMerciPericolose amp = (AllarmeMerciPericolose)intent.getExtras().get(IConstants.NOTIFICA_DATA);
notifyUser(amp, context);
}
}
catch (Exception e)
{
Log.e(TAG_LOG, "Errore nel receiver per le notifiche "+e.getMessage(), e);
}
}
private void notifyUser(AllarmeMerciPericolose amp, Context context) {
//Preparo la view per le notifiche; si deve utilizzare una RemoteView
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.activity_visualizza_notifica);
//Indico l'activity da richiamare quando clicco sulla notifica
Intent notificationIntent = new Intent(context, VisualizzaNotificaActivity.class);
//notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//Passo i parametri che l'activity dovrà gestire al suo interno
notificationIntent.putExtra(IConstants.NOTIFICA_DATA, amp);
//Apro l'activity indicata in precedenza
PendingIntent contentIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_CANCEL_CURRENT);
//Preparo il costruttore della notifica
Notification.Builder builder = new Notification.Builder(context);
//Inserisco l'icona della notifica
builder.setSmallIcon(R.mipmap.warning);
//Indico quando è creata la notifica
builder.setWhen(System.currentTimeMillis());
//Indico se continua; nel nostro caso non lo è perché non riguarda un processo di background e l'utente può decidere di
//dismettere la notifica stessa
builder.setOngoing(false);
//Dismettiamo la notifica
builder.setAutoCancel(false);
builder.setTicker(context.getString(R.string.notifica_ticker));
builder.setContentIntent(contentIntent);
builder.setContent(remoteView);
builder.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND);
//builder.setDefaults(Notification.DEFAULT_SOUND);
//Valorizzo i campi della notifica
remoteView.setTextViewText(R.id.data_notifica_text_id, DateUtil.formatMillisDate(amp.getDataAllarme()));
remoteView.setTextViewText(R.id.data_ricezione_notifica_text_id, DateUtil.formatMillisDate(amp.getDataRicezioneAllarme()));
TipoAllarmeMercePericolosa tmp = amp.getTipoAllarme();
if (tmp != null) {
String tipoNotifica = tmp.getCodiceAllarme() + " - " + tmp.getDescrizioneAllarme();
remoteView.setTextViewText(R.id.tipo_notifica_text_id, tipoNotifica);
}
remoteView.setTextViewText(R.id.descrizione_notifica_text_id, amp.getDescrizioneAllarme());
Notification notification = builder.build();
NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(IConstants.MQTT_NEW_NOTIFICATION_ARRIVED, notification);
}
}
在我的回调实现中,我以这种方式发送广播:
private void propagateBroadcastAction( AllarmeMerciPericolose amp )
{
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(IConstants.MQTT_MSG_RECEIVED_MSG);
broadcastIntent.putExtra(IConstants.NOTIFICA_DATA, amp);
currentService.sendBroadcast(broadcastIntent);
}
但我的自定义通知未显示;我将显示为通知的内容附加到用户(在我的模拟器中)
如您所见,通知已创建,但布局为空.... 我对失踪的想法有所了解吗?
谢谢
安吉洛