Erweiterte Notifications

  • 3 Antworten
  • Letztes Antwortdatum
F

Flocke123

Ambitioniertes Mitglied
4
Hallo zusammen,

...viele Sinnlos Infos wieder gelöscht...
Meine Notifikationen funktionieren allgemein gut. Ein Broadcast Receiver startet bei Device-Booted, der wiederum einen Service startet, der auf einkommende UDP Pakete auf einem bestimmten Port lauscht und mir dadurch eine Notifikation bildet.
Ein paar von euch erinnern sich vllt noch an eine Diskussion bzgl. "Akku wird zur Heizplatte" usw.
Erkenntnis: Ja, es frisst regelrecht den Akku auf... sehr schön zu beobachten, wie der Ladebalken nach unten geht. Wirklich Heiß wird das Gerät aber nicht. Nichts desto Trotz ist es keine schöne Sache, ich werde das anders gestalten.
Aber darum gehts ja im Moment nicht.

Jetzt zur eigentlichen Frage:
Ich sende ein Paket, es kommt an, Notifikation wird erstellt -> Wunderbar
Ich sende ein Zweites Paket, es kommt an, überschreibt die erste -> Schlecht
...

Warum erstellt er mir hier keine zweite Notifikation, die "unter der ersten" zu sehen ist?
Hintergrund ist, da später jede Notifikation eine spezielle Aufgabe hat.
Eine muss man mit einer Dezimalzahl quittieren, eine andere nur mit "ja" oder "nein".

Ich pack jetzt mal den ganzen Code mit rein, vielleicht ist es ja für andere Interessant zu wissen.

MyReceiver.class
Code:
public class MyReceiver extends BroadcastReceiver {
	public MyReceiver() {
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent serviceIntent = new Intent(context, MyService.class);
		context.startService(serviceIntent);
		Log.i("MyReceiver", "started");
		throw new UnsupportedOperationException("Not yet implemented");
	}
}

MyService.class
in der Wiederum ein AsyncTask ist, der mir die ankommenden Pakete in Notifikationen umwandelt.
Code:
public class MyService extends Service {
	
	DatagramSocket socket;
	
	public MyService() {
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO: Return the communication channel to the service.
		throw new UnsupportedOperationException("Not yet implemented");
	}

	@Override
	public void onDestroy() {
		Toast.makeText(this, "Hüpfburg Service Stopped", Toast.LENGTH_LONG).show();
		Log.d("MyService", "onDestroy");
		super.onDestroy();
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		Toast.makeText(this, "Hüpfburg Service Started", Toast.LENGTH_LONG).show();
		MyUdpListener listener = new MyUdpListener();
		listener.execute();
		super.onStart(intent, startId);
	}
	
	public class MyUdpListener extends AsyncTask<String, String, String> {

		@Override
		protected void onPreExecute() {
			Toast.makeText(getApplicationContext(), "Hüpfburg Udp Listener Started", Toast.LENGTH_LONG).show();
			super.onPreExecute();
		}
		
		@Override
		protected String doInBackground(String... arg0) {
			try {
				if (socket == null) {
					socket = new DatagramSocket(null);
					SocketAddress socketAddr = new InetSocketAddress(2050);
					socket.setReuseAddress(true);
					socket.setBroadcast(true);
					socket.bind(socketAddr);		
				}										
			} catch (SocketException e) {
				e.printStackTrace();
			}
			
			byte[] buf = new byte[1024];
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			
			while(true) {
				
				try {
					Log.i("MyUdpListener", "listening...");
					socket.receive(packet);
					String message = new String(packet.getData(), 0, packet.getLength());
					publishProgress(message);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		@Override
		protected void onProgressUpdate(String... values) {
			
			Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
			intent.putExtra("Text", values[0]);
			PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
			
			//Build Notification
			Notification n = new Notification.Builder(getApplicationContext())
			.setSmallIcon(R.drawable.ic_launcher)
			.setContentTitle("Hüpfburg")
			.setContentText(values[0])
			.setContentIntent(pIntent)
			.build();
			
			NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
			mNotificationManager.notify(0, n);
			
			super.onProgressUpdate(values);
		}

		@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
		}
	}
}


ResultActivty.class
die gestartet wird, wenn man auf die Notifikation klickt.
Seltsamerweise, steht hier immer nur der Text der ersten Notifikation, egal wieviele ich später noch erzeuge.
Code:
public class ResultActivity extends Activity {

	DatagramSocket socket;
	TextView tvResult;
	boolean connected;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tvResult = (TextView)findViewById(R.id.textViewResult);		
		
		Bundle extras = getIntent().getExtras();
		String text = null;
		if (extras != null) {
			text = extras.getString("Text");
			getIntent().removeExtra("Text");
		}
		
		if (text != null) {
			tvResult.setText(text);	
		}
		
	}

Zusammengefasst:
Was muss ich tun, damit ich meherer Notifikationen angezeigt bekomme und nicht nur immer die letzte.
Und wie muss ich das umsetzen, wenn ich unterschiedliche "Notifikationsmodelle" habe.

Hoffe es ist verständlich genug.

Gruß Flocke
 
Wegen der Notification, die überschrieben wird: in der MyService.class musst du jeder Notification eine eigene ID geben, wenn man wie du vorgehen willst.
Also:
x = x+1
MNotificationManager.notify(x, n)
Hoffe es hilft
 
Es heißt nicht umsonst notification ID :D
Eine ID ist eindeutig, und damit kann man Notifications in der Notificationbar "wiederfinden" und ändern..

und genau das tust du hier ;)

lg.
 
Danke,

ja, kA wie ich das übersehen konnte :D
Hat geklappt.

Die unterschiedlichen Notifikationen hab ich auch hinbekommen.
Im UDP Datagramm steht ein Hinweis darauf, um welche Art von Notifikation es sich handelt, und dementsprechend erstelle ich diese dann. Easy.

Gruß Flo
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
487
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten