Service event abfangen von Activity

  • Antworten:7
AlCap0rn
  • Forum-Beiträge: 32

13.07.2012, 12:07:07 via Website

Hey Community,

Folgendes Problem:
Ich habe einen InputMethodService und beim Drücken einer bestimmten Taste (physikalischen Taste) wird eine Activity gestartet. Diese Activity führt eine Funktion aus, welche ein Intent wirft und das Ergebnis über onActivityResult sich holt. Nun soll aber der Service darüber informiert werden, das ich einen Wert habe, der ins EditText geschrieben werden kann.

ich kann ja unmöglich den Activity für das Event registrieren, weil ich kein Activity-Objekt besitze, da ich es ja über startIntent rufe. Desweiteren beinhaltet der Service keine Funktion kein startActivityForResult und somit auch keine Callback-Funktion onActivityResult.

Um AIDL nutzen zu können benötige ich einen onBind(), welches der InputMethodService nicht hergibt.

Ich habe einfach keinen Plan was ich machen soll :/

Also nochmal zur Verdeutlichung

1Service ---startActivity()--> Activity --wirftIntent---> onActivtityResult()-+
2^----------------benachrichtigeUndGebeErgebnisAn------------------------------

Ich bin am Verzweifeln bitte helfen :)

Dangööö

Antworten
AlCap0rn
  • Forum-Beiträge: 32

13.07.2012, 16:32:55 via Website

Ich habe noch nie mit Recievern gearbeitet, besonders nicht mit einem Broadcast-Receiver. Kannst du mir einen guten Link empfehlen, wo es gut und ausführlich erklärt ist?

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

13.07.2012, 16:56:47 via Website

Zunächst: Ich mag Deinen Avatar nicht - aber das ist ja Geschmackssache.

Einen dynamische BroadcastReceiver hast Du in wenigen Schritten in Deinen Service reingeschraubt. Ich habe das als Template immer irgendwo rumfliegen. Dieser besteht aus einem Inner Class BR, zwei Methoden zum Starten und Stoppen, sowie je einem Call zum Starten und Stoppen - letzteres vorzugsweise in onStartCommand/onCreate/... respektive onDestroy:

1// Im Service
2// Inner Class BroadcastReceiver
3public class MyBroadcastReceiver extends BroadcastReceiver {
4
5 public static final String TAG = "dein.package.MyService.MyBroadcastReceiver";
6
7 public static final long ACTION_IRGENDWAS = 1;
8
9 @Override
10 public void onReceive(final Context context, final Intent intent) {
11 if (intent != null) {
12 Bundle bundleExtras = intent.getExtras();
13
14 if (bundleExtras != null) {
15 long action = bundleExtras.getLong("ACTION");
16 if (action == ACTION_IRGENDWAS) {
17 // ...
18 }
19 }
20 }
21 }
22}
23
24// Var
25private MyBroadcastReceiver receiver;
26
27// Methode
28private void processStartBroadcastReceiver() {
29 IntentFilter intentFilter = new IntentFilter(MyBroadcastReceiver.TAG);
30
31 receiver = new MyBroadcastReceiver();
32
33 if (receiver != null && intentFilter != null) {
34 registerReceiver(receiver, intentFilter);
35 }
36}
37
38// Methode
39private void processStopBroadcastReceiver() {
40 if (receiver != null) {
41 unregisterReceiver(receiver);
42 receiver = null;
43 }
44}
45
46// Im onDestroy
47processStopBroadcastReceiver();
48
49// Im onStartCommand oder onCreate oder ...
50processStartBroadcastReceiver();

Der Versender des BR hat es noch einfacher - eine Methode und ein Call:

1// In einer Activity
2// Methode
3private void processSendBroadcast(final String receiver, final long action) {
4 Intent intent = new Intent();
5 intent.putExtra("ACTION", action);
6 intent.setAction(receiver);
7 sendBroadcast(intent);
8}
9
10// Aufruf
11processSendBroadcast(MyService.MyBroadcastReceiver.TAG,
12 MyService.MyBroadcastReceiver.ACTION_IRGENDWAS);

Antworten
AlCap0rn
  • Forum-Beiträge: 32

16.07.2012, 08:10:43 via Website

Vielen Dank für die Ausführlichkeit! Ich werde es gleich mal einbauen

Auf dem Avatar steht "getStringFromObject()" kann man natürlich nicht so gut lesen und ist auch mehr als Scherz gedacht als irgendwie hier zu provozieren.

Antworten
AlCap0rn
  • Forum-Beiträge: 32

16.07.2012, 08:48:25 via Website

Wunderbar! Hat alles geklappt, vielen vielen Danl, hast mir eine Menge Zeit erspart! Ich habe versucht mit AIDL zu arbeiten, aber das ist schwerer als gedacht, besonders weil es nur einen Weg als Beispiel gab, aber ich benötigte den umgekehrten Fall!

Nur eine Frage zum Verständnis habe ich. ich habe in Code-Snippets des öfteren gesehen, dass ein BroadcastReceiver in der Manifest angegeben wurde, warum ist das hier nicht nötig?

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

16.07.2012, 09:15:26 via Website

Zum Avatar: Ich finds halt kindisch.

Zum BroadcastReceiver: Der von mir gezeigte BroadcastReceiver wird dynamisch erzeugt (gestartet) und wieder gestoppt. Dieser BroadcastReceiver muss nicht ins Manifest.

Das Gegenstück wäre zum Beispiel der "android.intent.action.BOOT_COMPLETED". Dieser wird vom System an Dich verschickt, startet automatisch und muss demzufolge ins Manifest.

Antworten
AlCap0rn
  • Forum-Beiträge: 32

16.07.2012, 09:22:42 via Website

Das mit dem Avatar ist ja nunmal wirklich Ansichtssache hehe, aber ich nehme das einfach mal so hin.

Trotzdem vielen Dank für deine Hilfe ;)

Antworten