Service und mehrere Activities

  • Antworten:3
Belv3dere
  • Forum-Beiträge: 68

31.03.2011, 16:41:35 via Website

Hallo,

ich starte aus meiner Main Activity ein Service und wechsel dann zu einer andere angelegte Activity.
1if(serviceIntent == null){
2 serviceIntent = new Intent(ActivityMain.this, Service.class);
3 startService(serviceIntent);
4}
5
6Intent myIntent = new Intent(ActivityMain.this, Activity2.class);
7 startActivity(myIntent);

Funktioniert auch alles! Service läuft und macht seinen Job, Activity wechselt!

Nur läuft der Service nicht mehr nach dem Wechseln zur Activity2. Habs mit nem getApplicationContext().bindService versucht, aber hat auch bisher nicht ganz geklappt.

Hoffe das mir jemand ein Tipp geben kann wie man ein Service mit mehreren Activities anspricht.

Danke

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

31.03.2011, 23:51:39 via Website

1.) Trag mal bitte statt ActivityMain.this --> getApplicationContext() ein

2.) Wie lautet Dein return im Service.onStartCommand? Da gibt es vielfältige Flags (START_STICKY zum Beispiel).

Gruß
Harald

Belv3dere

Antworten
Belv3dere
  • Forum-Beiträge: 68

04.04.2011, 12:59:11 via Website

Ich habe nochmal etwas rum gespielt und habe raus gefunden das es an dem Looper.loop(); liegt.
Wenn ich am ende meines Callbacks (in dem ich die andere Acitivy starte) Looper.loop(); mache, hört der Service auf.


Activity 1:
1Button btnLogin = (Button)findViewById(R.string.btnLogin);
2 btnLogin.setOnClickListener(new OnClickListener() {
3 @Override
4 public void onClick(View v) {
5
6
7 if(serviceIntent == null){
8 serviceIntent = new Intent(getApplicationContext(), Service.class);
9 startService(serviceIntent);
10 }
11
12 Cache.addDelegate("MAIN", this);
13} };
14
15
16public void onLogStateChange(final LoginState loginstate) {
17 Looper.prepare();
18 Log.d(TAG, "LOGINSTATE KAM ZURÜCK!!! : "+loginstate);
19
20 if(loginstate.equals(LoginState.LOGGED_IN)){
21 dialog.dismiss();
22 Toast.makeText(this, "Login Erfolgreich!", Toast.LENGTH_LONG).show();
23 Cache.removeDelegate("MAIN");
24 Intent myIntent = new Intent(ActivityMain.this, Activity2.class);
25 startActivity(myIntent);
26 } else {
27 dialog.dismiss();
28 Toast.makeText(this, "Login Fehlgeschlagen!", Toast.LENGTH_LONG).show();
29 }
30
31 Looper.loop();
32 Looper.myLooper().quit();
33 }

Wenn ich hier Looper.loop(); und Looper.myLooper().quit(); weg lasse... läuft der Service weiter und meine 2te Activity wird gestartet.
Jedoch habe ich dann da das problem das ich dort nicht wieder mit Looper.prepare(); arbeiten kann, da nur ein Loop erstellt werden kann.

Antworten
Belv3dere
  • Forum-Beiträge: 68

04.04.2011, 15:10:37 via Website

Ich habe etwas gefunden womit es klappt! Ich werde das mal hier posten falls nochmal jemand probleme hat. :grin:


Anstatt Looper.prepare(); / Looper.loop(); nutze ich dafür runOnUiThread();



Activity 1:

1if(serviceIntent == null){
2 serviceIntent = new Intent(getApplicationContext(), Service.class);
3 startService(serviceIntent);
4}
5
6Cache.addDelegate("MAIN", this); //Mein Callback vom Service!
7
8public void onLogStateChange(final LoginState loginstate) {
9 runOnUiThread (new Runnable(){
10 @Override
11 public void run(){
12 if(loginstate.equals(LoginState.LOGGED_IN)){
13 dialog.dismiss();
14 Toast.makeText(this, "Login Erfolgreich!", Toast.LENGTH_LONG).show();
15 Cache.removeDelegate("MAIN");
16 Intent myIntent = new Intent(this, Activity2.class);
17 startActivity(myIntent);
18 } else {
19 dialog.dismiss();
20 Toast.makeText(watch.this, "Login Fehlgeschlagen!", Toast.LENGTH_LONG).show();
21 }
22 }
23 });
24 }

In Activity 2 genau das gleiche mit runOnUiThread() anstatt irgendwas mit Looper.
Activity 2:
1public void onBlubChange(String string) {
2 runOnUiThread (new Runnable(){
3 @Override
4 public void run(){
5 TextView irgendwas= (TextView)findViewById(R.id.irgendwas);
6 irgendwas.setText(string);
7 }
8 });
9 }

So klappt es bei mir jetzt alles perfekt! Service läuft weiter nach dem wechseln der Activitys, meine Callbacks dürfen im MainThread arbeiten.
Für mich bis zu dem Punkt alles super.

Falls jemand Verbesserungsvorschläge hat, gerne her damit ;)

Antworten