2015-01-22 16 views
11

Ho un ricevitore broadcast nella mia app che viene attivato ogni volta che l'utente riceve una chiamata in entrata. Ora, quando succede, ho bisogno che il destinatario della trasmissione invochi un metodo specifico in un'attività specifica. Ora, ho provato a rendere questo metodo statico e quindi disponibile, ma qualcosa mi dice che è una pessima idea.Comunicazione tra BroadcastReceiver e Activity - android

Di conseguenza, ho provato a istanziare il destinatario della trasmissione all'interno della mia attività senza dichiararlo nel mio manifest, ma il problema è che - quando l'app è spenta, l'attività non esiste e quindi non posso invocare il mio metodo.

Quindi la mia domanda è: come posso invocare questo metodo quando il ricevitore broadcast viene attivato, senza renderlo "pubblico statico"?

Ecco il mio codice di attività (Ho cancellato le parti irrilevanti)

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

quando u riceve la chiamata il vostro applicaiton è si rivolge a background.so che u farà con l'attività (quando ur applicazione è in background) ?? – KomalG

+0

questo metodo deve necessariamente trovarsi all'interno della classe 'Activity'? – mangusta

+0

Cosa farà quel metodo? – Chandrakanth

risposta

4

Questo potrebbe aiutare: how can I notify a running activity from a broadcast receiver?

Inoltre, è possibile provare a utilizzare Observers

Qualcosa di simile:

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

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

Nella ricezione broadcast Iver:

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

e l'attività:

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

la funzione di aggiornamento non viene chiamata :( –

33

È possibile utilizzare gli osservatori, come

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); 
     } 
    } 
} 

Il ricevitore può essere utilizzato tramite manifest. ObservableObject - deve essere singleton.

+0

fantastico ragazzo.buon lavoro.piace per me – Amir

+0

Ottima risposta! Mi piace usare modelli di progettazione) – Sermilion

+1

Qual è il vantaggio rispetto all'utilizzo di una variabile statica? Voglio dire, Singleton è statico comunque, giusto? – JohnyTex