Aktivity startet mehrfach

  • Antworten:6
Jürgen
  • Forum-Beiträge: 50

25.09.2012, 12:25:31 via Website

Hi,

Meine App hat etwa folgenden Aufbau:
- im Hintergrund läuft ein Service, der nach dem Booten automatisch gestartet wird,
- der Service triggert ein Ereignis und erzeugt eine Notification,
- von der Notivication aus kommt man zu Haupt-Activity die bis dahin nicht sichtbar ist,

Die 2. Möglichkeit ist durch klick auf das Icon die Activity zu starten.

Jetzt passiert folgendes:

Wenn man die Activity über die Notification aufruft und dann in den Hintergrund schickt,
dann über das Icon der Activity diese aufruft, hat man eine neue Instanz :blink:

Wie kann ich das verhindern?

Gern hätte ich ja auch Codeschnippsel dazu gepostet aber ich wüsste gerade gar nicht welcher Teil dafür verantwortlich ist.

Schon mal THX für Eure eventuelle Hilfe,
Gruß
J.

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

25.09.2012, 12:48:08 via Website

Das Geheimnis ist das Flag Intent.FLAG_ACTIVITY_SINGLE_TOP. In Deinem Service hast Du ja etwas wie dieses:

1private void processStartNotification() {
2 Intent intent = new Intent(this, DeineActivity.class);
3 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
4
5 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
6
7 Notification notification = new Notification(R.drawable.irgendwas, appName, System.currentTimeMillis());
8 notification.setLatestEventInfo(this, appName, getResources().getString(R.string.txt_irgendwas), pendingIntent);
9
10 notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
11 notificationManager.notify(irgendwas, notification);
12 }

Antworten
Jürgen
  • Forum-Beiträge: 50

25.09.2012, 16:20:07 via Website

Danke für die Antwort.

Und ja das hab ich so drin. Funktioniert ja auch soweit, wenn ich
immer über die Notification zur Activity gehe.

Funktioniert aber nicht, wenn ich zwischen durch über das Icon der Activity gehe. :(

1/*
2 * Start Notivication
3 */
4 private void processStartNotification(String str) {
5
6 int icon = R.drawable.icon_min;
7 String title = getString(R.string.Message);
8 String text = str;
9 long when = System.currentTimeMillis();
10
11 Intent intent = new Intent(this, Main.class);
12 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
13
14 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
15
16 Notification notification = new Notification(icon, title, when);
17 notification.setLatestEventInfo(this, title, text, pendingIntent);
18 notification.defaults |= Notification.DEFAULT_SOUND;
19 notification.flags |= Notification.FLAG_NO_CLEAR;
20
21 NotificationManager mgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
22 mgr.notify(ID, notification);
23 notifyOn = true;
24 }

Gruß
J.

Edit: Könnte es daran liegen, dass der Service nicht an die Activity gebunden ist?

— geändert am 25.09.2012, 16:25:59

Antworten
Jürgen
  • Forum-Beiträge: 50

25.09.2012, 21:32:11 via Website

..und was passiert wenn Du das Deinem normalen Aufruf ebenfalls verpasst?

Das weis ich nicht :grin:
weil ich nicht genau weis wo das da hin muss.

Gruß
J.

EDIT:
1@Override
2 public void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 //setContentView(R.layout.activity_main);
5
6 final TabHost tabHost = getTabHost();
7 Resources res = getResources();
8 Intent intent;
9
10 // erstes Tab: eine View
11 LayoutInflater.from(this).inflate(R.layout.activity_main,
12 tabHost.getTabContentView(), true);
13 TabSpec ts1 = tabHost.newTabSpec("tab-1");
14 ts1.setIndicator(getString(R.string.btn_1),
15 res.getDrawable(R.drawable.ic_tab_1));
16 ts1.setContent(R.id.ll1);
17 tabHost.addTab(ts1);
18
19 // zweiter Tab: Intent
20 TabSpec ts2 = tabHost.newTabSpec("tab-2");
21 ts2.setIndicator(getString(R.string.title_activity_main));
22 intent = new Intent(this, PlayerActivity.class);
23 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
24 ts2.setIndicator(getString(R.string.btn_2),
25 res.getDrawable(R.drawable.ic_tab_2));
26 ts2.setContent(intent);
27 tabHost.addTab(ts2);
28
29// tabHost.setCurrentTab(0);
30 tabHost.setOnTabChangedListener(this);
31
32 Init();
33 }

An der Stelle bringt es nicht den gewünschten Erfolg, was eigentlich klar ist

— geändert am 25.09.2012, 22:00:18

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

26.09.2012, 00:09:43 via Website

Das gehört in den Application - Activity Zweig Deines Manifestes so eingebaut: android:launchMode="singleTop"

lg Voss

Antworten
Jürgen
  • Forum-Beiträge: 50

26.09.2012, 00:17:39 via Website

Danke! Ganz sehr!

Werd ich machen, ich schätze das ist geau was ich gesucht / gebraucht hab.

Gruss
J.

EDIT:
ja bringt eine Verbesserung. THX
nur bei Taste "zurück" ist es noch möglich, das der gestartete Mediaplayer weiter läuft
und dann 2x gestartet werden kann, dass ist aber nicht schlimm, dann beende ich den in der onDestroy eben.

Bei der Gelegenheit, worin besteht denn der Unterschied zwischen:
"singleTop"
"singleInstance"
"singleTask"

?

— geändert am 26.09.2012, 19:25:35

Antworten