# extends Activity für Berechnungen?



## Gast2 (15. Okt 2012)

Hi,

wenn ich eine Nebenklasse benötige, in der ich nur Berechnungen (mit Listener) durchführen will,
braucht diese Klasse dann "extends Activity"???

LG! Frank


----------



## KSG9|sebastian (15. Okt 2012)

*Ist* es denn eine Activity wenn "es" ausschließlich berechnet und nix von Android, GUI oder sonstigem weiß geschweige denn irgendwie selbst eine Oberfläche hat?


----------



## schlingel (15. Okt 2012)

Prinzipiell ist die Antwort auf solche Fragen meistens Nein. Wie KSG9|sebastian richtig gefragt hat, gibt's da ja ein paar Punkte die man machen möchte, wenn man eine Activity braucht.

Da du nachfragen musst, möchtest du das nicht machen. Also Nein. 

Du kannst natürlich trotzdem die Klasse als Listener oder als Publisher von Events verwenden, das hat ja so nichts mit der UI zu tun.


----------



## Gast2 (15. Okt 2012)

Ne, es hat keine eigene Oberfläche.

Mein Gedanke, dass ich die Klasse RechneRum extends Activity mache ist,
dass womöglich die Zusammenarbeit der Klassen besser sein könnte.

(Klingt vielleicht voll anfängermässig, ist es auch.  )


Ich habe z.B. beobachtet, dass das vibrieren lassen nur funktioniert, wenn die Klasse um Activity erweitert wurde.

```
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
		v.vibrate(800);
```

Bei Der Verwendung von 
	
	
	
	





```
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
```
scheint es genau so zu sein und SensorManager brauche ich.

Frank


----------



## schlingel (15. Okt 2012)

1. Immer in die Doku schauen. In diesem Fall kannst du die getSystemService-Methoden direkt in einer Activity verwenden, weil eine Activity ein Context-Objekt ist. Das heißt, wenn du die Service-Objekte nicht übergeben möchtest, übergib ein Context-Objekt. Über das kannst du das dann leicht instantieren. 

2. Du schadest dir mit dem Vorgehen von Activity abzuleiten mehr als es dir hilft. Prinzipiell möchtest du ja eine Klasse schreiben um sie in anderen Activity zu verwenden. Wenn diese Klasse nun von Activity ableitet, kann sie auch nur noch mit dieser Activity verwendet werden. Dann müsstest du das ganze über startActivityForResult machen und das hört sich nicht danach an als wäre das in deinem Kontext sinnvoll. 

Es kann schon sinnvoll sein, in einer Klasse die selbst keine UI-Klasse ist ein Context-Objekt zu haben. Die Adapter-Klassen für ListViews sind solche Fälle. Dort braucht man das Context-Objekt um einen Inflater zu erzeugen über den dann die Kindelemente befüllt werden können. 

Aber man sollte immer wissen warum und wozu man das braucht.


----------



## Gast2 (15. Okt 2012)

Na ich glaube, ich muss konkreter werden.
ich habe folgende App:

```
public class MainActivity extends Activity {

	private TextView txv;
	private int threshold, ergebnis;
	private SensorManager manager;
	private Sensor sensorLight;
	private SensorEventListener listener;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		txv = (TextView) findViewById(R.id.txv);
		manager = (SensorManager) getSystemService(SENSOR_SERVICE);
		sensorLight = manager.getDefaultSensor(Sensor.TYPE_LIGHT);
		threshold = 500;
		txv.setText("Warten!");
		Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
		v.vibrate(100);
		sensorLight();
	}

	/**
	 * Beobachten und Auswerten des Lichtwertes.
	 */
	public void sensorLight() {
		listener = new SensorEventListener() {
			@Override
			public void onAccuracyChanged(Sensor sensor1, int accuracy) { }

			@Override
			public void onSensorChanged(SensorEvent event) {
				if (event.values.length > 0) {
					ergebnis = (int) (event.values[0] + 0.5f);
					if (ergebnis > threshold) {	
						txv.setText("Licht!");
					} 
				}
			}
		};
		manager.registerListener(listener, sensorLight,
				SensorManager.SENSOR_DELAY_NORMAL);
	}
}
```

Das ist ein Beispiel für eine größere App, aber für meine / diese Zwecke gut.
So weit funktioniert die App.

Mein Ziel ist es die Methode sensorLight() zu einer Bibliothek zu machen, welche ich in verschiedenen App nutzen kann.
Mein Plan ist folgender:
1.) die Methode in eine KlasseSucheLicht auslagern
2.) diese Klasse zur Bibliothek machen

Meine ungelösten Fragen:
Wie bekomme ich die Methode in eine WaitingForLight ? 
(Wie zu sehen ist bin ich bis jetzt nicht sehr weit gekommen, obwohl ich mich seit heute morgen damit beschäftige.)

Wie erfährt MainActivity, wenn das Ereignis aus sensorLight(): (ergebnis > threshold) = true ist?
(siehe Zeile 36)

Wenn ich eine zweite Klasse schreibe, etwa so:
[XML]public class WaitingForLight {

	private int threshold;
	private SensorManager manager;
	private Sensor sensorLight;
	private SensorEventListener listener;

	WaitingForLight() {
		threshold = 200;
		manager = (SensorManager) getSystemService(SENSOR_SERVICE);
	}
}[/XML]
, dann gibt es bereits einen Fehler in Zeile 10 beim Parameter SENSOR_SERVICE:


> SENSOR_SERVICE cannot be resolved to a variable



Ja warumennich???
In der Klasse MainActivity funktionierte es doch auch???

Falls mir jemand helfen kann, ich würde mich freuen.
Frank


----------



## schlingel (15. Okt 2012)

Da meine vorherige Antwort um 12:41 geposted wurde und deine fast zwei Stunden später kam, gehe ich davon aus, dass du mich oben nicht verstanden hast.

Also noch einmal: Du brauchst ein Context-Objekt.


```
public class WaitingForLight {
 
    private int threshold;
    private SensorManager manager;
    private Sensor sensorLight;
    private SensorEventListener listener;
    private Context ctxt; 

    WaitingForLight(Context ctxt) {
        this.ctxt = ctxt;
        threshold = 200;
        manager = (SensorManager) this.ctxt.getSystemService(Context.SENSOR_SERVICE);
    }
}
```
(Wie immer ungetestet aber das Schema sollte klar sein.)


----------



## Gast2 (15. Okt 2012)

schlingel hat gesagt.:


> Da meine vorherige Antwort um 12:41 geposted wurde und deine fast zwei Stunden später kam, gehe ich davon aus, dass du mich oben nicht verstanden hast.



So war es. Aber jetzt hab ich's.
That makes me happy!


----------

