Android Kommunikation zwischen Service und Activity

  • Themenstarter Themenstarter ChrisH
  • Beginndatum Beginndatum
C

ChrisH

Gast
Hallo,
Ich habe mal eine Frage:

Am Anfang der Activity soll einmal die Zeit abgefragt werden, die dann auch in den TextViews angezeigt wird. Nun wird ein Service gestartet, der nach jeder Minute der Activity "sagen" soll, dass die Zeit aktualisiert werden muss. Ich habe im Internet verschiedene Methoden gefunden, zwischen dem Service und der Activity zu kommunizieren. Mir schien die Methode mit dem BroadcastReceiver am sinnvollsten und überschaubarsten. Wenn ich jetzt aber die Applikation starte wird die Zeit nicht aktualisiert.
Ich habe mich nun schon länger damit beschäftigt, aber keine Lösung gefunden.

Über Antworten und Tipps würde ich mich sehr freuen!


Hier ist der Quellcode(da ich mir Java selbst beigebracht habe, oder dabei bin ist die Textformatierung sicherlich nicht korrekt) von meiner Activity:

Java:
public class Home extends Activity {
   
	
	TextView tv1;
	TextView tv2;
	Time time = new Time();
	private BroadcastReceiver mReceiver;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.homelayout);
        
        tv1 = (TextView)findViewById(R.id.textView1);
        tv1.setTextColor(Color.GRAY);
        tv2 = (TextView)findViewById(R.id.textView2);
        tv2.setTextColor(Color.GRAY);
        time.setToNow();
        tv1.setText(time.format("%H%:%M"));
        tv2.setText(time.format("%d%.%m%.%Y"));
        startService(new Intent(this,UhrService.class));
        
    }
    	
    	
    	 
    	private void refresh(){
    	 tv1.setText(time.format("%H%:%M"));
    	 tv2.setText(time.format("%d%.%m%.%Y"));
    	 }
    	 

    
    @Override
    public void onResume(){
    	super.onResume();
    	IntentFilter filter = new IntentFilter("android.intent.action.MAIN");
    	mReceiver = new BroadcastReceiver() {
    	@Override
    	 public void onReceive(Context arg0, Intent arg1) {
    	 refresh();
    	 }
    	 };
    	this.registerReceiver(mReceiver,filter);
    	
    }
    
    @Override
    public void onPause(){
    	super.onPause();
    	this.unregisterReceiver(this.mReceiver);
    	
    }
}

...und hier von meinem Service:

Java:
public class UhrService extends Service {

	
		Time time = new Time();
		int altMinute;
		int z;
		
	@Override
	public void onCreate(){
		super.onCreate();
		z = 1;
		ZeitHolen();
		
	}
		void ZeitHolen(){
			
			
		while(true){	
		time.setToNow();
				
		             if(z==1)
                                      {
				altMinute=time.minute;
				z++;
			}
				
				
		int dif = time.minute-altMinute;
	           		
			if(dif>=1)
                                      {
	           			
			Intent intent = new Intent("android.intent.action.MAIN");
			sendBroadcast(intent);
                                      altMinute=time.minute;
	           		}

	           			
	           			
	           		}	
	        
		}
		
		

		@Override
		public IBinder onBind(Intent arg0) {
			// TODO Auto-generated method stub
			return null;
		}
		}
 
Wo sollte denn die Zeit aktualisiert werden? Du machst ja nie eine Veränderung am Time-Objekt, dementsprechend bleibt es immer gleich.

Du müsstest im refresh() schon auch die Zeit und nicht nur die Views updaten. Warum brauchst du da überhaupt einen Service? Gibt's Bereiche wo diese Updates von Interesse sind auch wenn die Activity nicht gerade sichtbar ist?

Wenn nein wäre ein Thread sinnvoller.
 
Danke für die schnelle Antwort!

Ja, es muss schon ein Service sein.

Ich habe das im refresh() jetzt geändert, aber die Zeit wird trotzdem nicht aktualisiert.
Ich finde im Quellcode keinen Fehler.
 
So:
Java:
private void refresh(){
    	time.setToNow();
    	tv1.setText(time.format("%H%:%M"));
    	tv2.setText(time.format("%d%.%m%.%Y"));
}
 
Jetzt kommt immer die Meldung : Die Anwendung reagiert nicht mehr.

Davor wird der Service gestartet und durchläuft x-mal die while-Schleife.
Glaube nicht, dass onReceive() aufgerufen wird (davor komm immer die Fehlermeldung)
 
Jetzt kommt immer die Meldung : Die Anwendung reagiert nicht mehr.

Davor wird der Service gestartet und durchläuft x-mal die while-Schleife
Klar, der Service ist in einer Endlosschleife. Für das System ist nicht erkennbar ob die App hängt oder ob das tatsächlich gewollt war.

Löse das ganze mit Threads und lass diesen periodisch schlafen.
 

Zurück
Oben