2015-01-22 8 views
11

Ich habe einen Broadcast-Empfänger in meiner App, die jedes Mal ausgelöst wird, wenn der Benutzer einen eingehenden Anruf erhält. Jetzt, wenn es passiert, brauche ich den Broadcast-Empfänger, um eine bestimmte Methode in einer bestimmten Aktivität aufzurufen. Nun habe ich versucht, diese Methode statisch und damit verfügbar zu machen, aber etwas sagt mir, dass es eine sehr schlechte Idee ist.Kommunikation zwischen BroadcastReceiver und Aktivität - Android

Dementsprechend habe ich versucht, den Broadcast-Empfänger innerhalb meiner Aktivität instanziieren, ohne es in meinem Manifest zu deklarieren, aber das Problem ist - wenn die App ausgeschaltet ist, ist die Aktivität nicht vorhanden und daher kann ich meine Methode nicht aufrufen.

Also meine Frage ist - Wie kann ich diese Methode aufrufen, wenn der Rundfunkempfänger ausgelöst wird, ohne es "öffentlich statisch" zu machen?

Hier ist meine Aktivitätscode

package com.silverfix.ringo.activities; 

import com.silverfix.ringo.R; 
import com.silverfix.ringo.activities.fragments.DataManagerFragment; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.app.FragmentTransaction; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 

public class RingtonesActivity extends Activity{ 

    private DataManagerFragment dataManagerFragment; 
    private IntentFilter filter; 
    private BroadcastReceiver phoneCall; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ringtones); 
     ActionBar ab = getActionBar(); 
     ab.setDisplayShowTitleEnabled(false); 
     ab.setDisplayHomeAsUpEnabled(true); 
     dataManagerFragment = new DataManagerFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.add(dataManagerFragment, "DataManagerFragment"); 
     ft.commit(); 
     filter = new IntentFilter(); 
     filter.addAction("android.intent.action.PHONE_STATE"); 
     phoneCall = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       dataManagerFragment.act(); 
      } 
     }; 
     registerReceiver(phoneCall, filter); 
    } 
} 
+0

, wenn u die Ihre applicaiton erhalten nennen, ist dann auch background.so was u mit Aktivität zu tun (wenn ur App im Hintergrund ist) ?? – KomalG

+0

Muss diese Methode unbedingt innerhalb der 'Activity' Klasse sein? – mangusta

+0

Was wird diese Methode tun? – Chandrakanth

Antwort

4

(ich die irrelevanten Teile gelöscht haben) Dies könnte helfen:

So etwas wie how can I notify a running activity from a broadcast receiver?

, können Sie versuchen Observers Sie sich auch:

public class BroadcastObserver extends Observable { 
    private void triggerObservers() { 
     setChanged(); 
     notifyObservers(); 
    } 

    public void change() { 
     triggerObservers(); 
    } 
} 

In Ihrem Rundfunkempfang Iver:

@Override 
public void onReceive(Context context, Intent intent) { 
    BroadcastObserver bco = new BroadcastObserver(); 
    bco.change(); 
} 

und der Aktivität:

public class YourActivity extends Activity implements 
     Observer { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     BroadcastObserver bco = new BroadcastObserver(); 
     bco.addObserver(this); 
    } 

    @Override 
    public void update() { 
     //TODO: call your desired function 
    } 
} 
+0

Update-Funktion wird nicht aufgerufen :( –

33

Sie können Beobachter verwenden, wie

public class MyReceiver extends BroadcastReceiver { 
    public MyReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ObservableObject.getInstance().updateValue(intent); 
    } 
} 

public class MainActivity extends Activity implements Observer { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ObservableObject.getInstance().addObserver(this); 
    } 

    @Override 
    public void update(Observable observable, Object data) {    
     Toast.makeText(this, String.valueOf("activity observer " + data), Toast.LENGTH_SHORT).show(); 
    } 
} 

public class ObservableObject extends Observable { 
    private static ObservableObject instance = new ObservableObject(); 

    public static ObservableObject getInstance() { 
     return instance; 
    } 

    private ObservableObject() { 
    } 

    public void updateValue(Object data) { 
     synchronized (this) { 
      setChanged(); 
      notifyObservers(data); 
     } 
    } 
} 

Empfänger kann über Manifest verwendet werden. ObservableObject - muss Singleton sein.

+0

ehrfürchtigen Kerl. Gute Arbeit. Es funktioniert für mich – Amir

+0

Große Antwort! Ich mag mit Design-Muster) – Sermilion

+1

Was ist der Vorteil im Vergleich zu nur mit einer statischen Variable? Ich meine Singleton ist sowieso statisch, oder? – JohnyTex