Repaint MainActivity durch Service

  • Antworten:7
  • Bentwortet
Raimund Rittnauer
  • Forum-Beiträge: 4

18.08.2011, 22:38:37 via Website

Hallo,
ich verwende meine Main Activity um einen Text zu zeichnen. Im Hintergrund läuft ein Service, der auf die Tasten eines Bluetoothgeräts hört.
Wenn ich am Gerät eine Taste betätige - wird ein wert in die Lokale Datenbank geschrieben - dieser soll im MainActivity gezeichnet werden.
Es funktioniert alles, die richtigen Werte wären da, nur fehlt einfach das repaint der Activity ... und ich kann das repaint vom Service nicht aufrufen.

Ich habe es mit einem BroadCastReceiver versucht, glaube hab mich aber etwas vertan ...

----------
Hier ist die Methode im Service "ControllerService"

1>private void insertToDB(int iWert, char c) {
2>>>>if(zt.getJoystickMoved().x == iWert) {
3>>>>>>>sendOrderedBroadcast(i,null);
4>>>>>>>Log.i("Broadcast","send!");
5>>>>>>>//hier möchte ich die Activity neu zeichnen - der Broadcast wird gesendet, kommt aber nie an
6>>>>}
7>}
----------

Hier ist die Main Activity
1>public void onCreate(Bundle savedInstanceState) {
2>>>>super.onCreate(savedInstanceState);
3>>>>registerReceiver(resetReceiver, new IntentFilter("my.intent.INTENT_NAME"));
4>}
5
6>public BroadcastReceiver resetReceiver = new BroadcastReceiver() {
7>>>>@Override
8>>>>public void onReceive(Context context, Intent intent) {
9>>>>>>>Log.i("Broadcast", "got Broadcast!");
10>>>>>>>MainActivity.this.cc.invalidate();
11>>>>>>>//cc.invalidate() zeichnet alles neu und aktualisiert somit die neuen Werte
12>>>>>>>//cc ist eine View, die die paint logik beinhaltet
13>>>>>>>this.setResultCode(Activity.RESULT_OK);
14>>>>}
15>}

Der BroadcastReceiver im MainActivity empfängt überhaupt nichts ...
Registrieren kann ich ihn ja auch nicht in der AndroidManifest datei ... da ich ja nur die Methode
verwende - ich glaube ich hab irgendetwas falsch verstanden ...
Ich hoffe jemand kann mir bei diesem Problem helfen


----------


PS: Im Android Manifest ist dieser Code

1<?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.test.countV1"
4 android:versionCode="1"
5 android:versionName="1.0">
6 <uses-sdk android:minSdkVersion="10" />
7 <uses-permission android:name="android.permission.VIBRATE"/>
8 <uses-permission
9 android:name="android.permission.BLUETOOTH" />
10 <uses-permission
11 android:name="android.permission.BLUETOOTH_ADMIN" />
12
13 <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="com.test.data.ListHelper">
14 <activity android:name=".MainActivity"
15 android:label="@string/app_name">
16 <intent-filter>
17 <action android:name="android.intent.action.MAIN" />
18 <action android:name="my.intent.INTENT_NAME"/>
19 <category android:name="android.intent.category.LAUNCHER" />
20 </intent-filter>
21 </activity>
22 <activity android:label="PreferencesActivity" android:name="PreferencesActivity"></activity>
23 <activity android:name="ZtPreferencesActivity" android:label="ZtPreferencesActivity"></activity>
24 <activity android:name="customizePreferences"></activity>
25 <activity android:name="ControllerActivity"></activity>
26 <service android:name="com.test.services.ControllerService"></service>
27 <activity android:name="BatteryActivity"></activity>
28 </application>
29 </manifest>

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

19.08.2011, 06:49:04 via Website

Schmeiß mal diese Zeile aus Deinem Manifest:

1<action android:name="my.intent.INTENT_NAME"/>


Hier ein Rumpf der immer funktioniert:

1public class MyActivity extends Activity {
2
3 public class MyBroadcastReceiver extends BroadcastReceiver {
4
5 public static final long REPAINT = 1;
6
7 public static final String BROADCASTRECEIVER = de.mydomain.mypackage.myactivity.MyBroadcastReceiver";
8
9 @Override
10 public void onReceive(final Context context, final Intent intent) {
11 if (intent != null) {
12 Bundle bundleExtras = intent.getExtras();
13 if (bundleExtras != null) {
14 long action = bundleExtras.getLong("ACTION");
15 switch (action) {
16 //TODO:
17 }
18 }
19 }
20 }
21 }
22
23 private MyBroadcastReceiver myBroadcastReceiver;
24
25 @Override
26 protected void onPause() {
27 processStopBroadcastReceiver();
28
29 super.onPause();
30 }
31
32 @Override
33 protected void onResume() {
34 super.onResume();
35
36 processStartBroadcastReceiver();
37 }
38
39 private void processStartBroadcastReceiver() {
40 myBroadcastReceiver = new MyBroadcastReceiver();
41 if (myBroadcastReceiver != null) {
42 IntentFilter intentFilter = new IntentFilter(MyActivity.MyBroadcastReceiver.BROADCASTRECEIVER);
43 if (intentFilter != null) {
44 registerReceiver(myBroadcastReceiver, intentFilter);
45 }
46 }
47 }
48
49 private void processStopBroadcastReceiver() {
50 if (myBroadcastReceiver != null) {
51 unregisterReceiver(myBroadcastReceiver);
52 myBroadcastReceiver = null;
53 }
54 }
55}


Und hier der Aufruf aus Deinem Service:

1...
2processSendBroadcast(MyActivity.MyBroadcastReceiver.BROADCASTRECEIVER, MyActivity.MyBroadcastReceiver.REPAINT);
3...
4
5private void processSendBroadcast(final String receiver, final long action) {
6 Intent intent = new Intent();
7 intent.putExtra("ACTION", action);
8 intent.setAction(receiver);
9 sendBroadcast(intent);
10}

— geändert am 19.08.2011, 17:35:50

Raimund Rittnauer

Antworten
Raimund Rittnauer
  • Forum-Beiträge: 4

19.08.2011, 15:11:29 via Website

Also du bist echt mein Held ...
Es funktioniert alles einwandfrei ... ich habe ewig für ein Beispiel gegoogled ...

Nochmals vielen Dank,

Raimund

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

19.08.2011, 16:07:53 via Website

Hört man gerne.

Bitte überweisen Sie den Gesamtbetrag in Höhe von EUR ... ;-)

Gruß
Harald

Raimund Rittnauer

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

19.08.2011, 17:37:48 via Website

In meinem Code war noch ein Gedankenfehler - ist oben korrigiert. Ich schicke Dir eine PM um Dich darauf aufmerksam zu machen. Statt im onDestroy solltest Du im onPause den BroadcastReceiver abschalten. Du solltest das Repaint der UI unterlassen wenn die UI ohnehin nicht sichtbar ist.

Antworten
Raimund Rittnauer
  • Forum-Beiträge: 4

19.08.2011, 17:50:52 via Website

Admin Service Limited
In meinem Code war noch ein Gedankenfehler - ist oben korrigiert. Ich schicke Dir eine PM um Dich darauf aufmerksam zu machen. Statt im onDestroy solltest Du im onPause den BroadcastReceiver abschalten. Du solltest das Repaint der UI unterlassen wenn die UI ohnehin nicht sichtbar ist.

Und ich danke Dir schon wieder, ist schon ausgebessert : )

Nur eine kleine Zwischenfrage noch - ist es egal wenn man bei den Methoden "onDestroy()" und "onPause()" vor der eigenen Logik
"super.onDestroy()", ... aufruft?

Oder soll man "super" immer nach der Logik aufrufen?

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

19.08.2011, 21:41:19 via Website

Gute Frage: Ich habe es bisher immer so gehalten das ich beim Erzeugen (z.B. onCreate, onStart, on Resume, ...) zunächst den super aufrufe und beim Beenden (onDestroy, onPause, ...) den super zum Schluß.

Ehrlich gesagat habe ich das nie hinterfragt. Ich habe aber unter anderem IBMs OS/2 mit seinem Presentation Manager sehr lange begleitet und kenne mich mit den event-gesteuerten Systemen ziemlich gut aus. Ich betrachte die grafische Oberfläche des Android wie OS/2s PM - ein eventgesteuertes UI. Nur in dem einen Fall kamen Messages in die Loop und im anderen Fall Methoden Aufrufe.

Deshalb gebe ich beim Anlegen zunächst dem übergeordneten System die Möglichkeit für mich alles vorzubereiten und beim Beenden räume ich erst brav auf bevor ich das System den Rest erledigen lasse.

Bisher lag ich damit eigentlich ganz gut. In einem Projekt habe ich mir sogar eine Warnung reingeschrieben es bloß so zu belassen da ich sonst lustige Timing-Effekte bekomme.

— geändert am 19.08.2011, 21:43:23

Antworten
Raimund Rittnauer
  • Forum-Beiträge: 4

19.08.2011, 22:22:11 via Website

Ich habe es bisher auch immer so gehandhabt - und werde es dann auch in Zukunft tun, hat mich eben nur mal Interessiert ... Aber dann werde ich Deinem Rat folgen und auch so weitermachen.

Antworten