Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-服务和通知创建_Android_Notifications - Fatal编程技术网

Android-服务和通知创建

Android-服务和通知创建,android,notifications,Android,Notifications,从今天早上开始,我一直在努力解决这个问题(至少对我来说这是个问题) 我的情况如下: 我构建了一个Android后台服务,它正在监听MQTT主题。当此服务收到MQTT消息时,它将为用户创建通知。 我的服务能够侦听和接收MQTT消息。我不能做的是显示我自己的通知布局并单击通知以查看通知详细信息 我正在使用以下软件版本: 安卓: 编译版本:21 明斯克1:16 targetSdkVersion:21 MQTT客户端:PAHO 1.0.2 在我的服务中,当我建立与mqttTopic的连接时,我使

从今天早上开始,我一直在努力解决这个问题(至少对我来说这是个问题) 我的情况如下: 我构建了一个Android后台服务,它正在监听MQTT主题。当此服务收到MQTT消息时,它将为用户创建通知。 我的服务能够侦听和接收MQTT消息。我不能做的是显示我自己的通知布局并单击通知以查看通知详细信息 我正在使用以下软件版本:

  • 安卓:
    • 编译版本:21
    • 明斯克1:16
    • targetSdkVersion:21
  • MQTT客户端:PAHO 1.0.2
在我的服务中,当我建立与mqttTopic的连接时,我使用自己的接口org.eclipse.paho.client.mqttv3.MqttCallback实现

我将接收mqtt消息的服务实例传递给该接口。 在回调中,我想使用自己的布局创建一个通知 这是我写的代码:

涉及的方法(currentService是服务实例)

activity\u visualiza\u 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>
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>
在回调实现中,我以以下方式发送广播:

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);
}
但我的自定义通知未显示;我将显示为通知的内容附加到用户(在我的模拟器中)

如您所见,通知已创建,但布局为空。。。。 知道我遗漏了什么吗

多谢各位


安吉洛

你试过这个例子吗:@AnggrayudiH谢谢你的回答。我试过了,得到了同样的结果……试一下
NotificationCompat.Builder
,看看会发生什么。@AnggrayudiH遗憾的是,我使用
NotificationCompact.Builder
也得到了同样的结果。。。这真的令人沮丧
<?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>
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);
}