2015-01-22 3 views
11

У меня есть приемник вещания в моем приложении, который запускается каждый раз, когда пользователь получает входящий звонок. Теперь, когда это произойдет, мне нужен широковещательный приемник для вызова конкретного метода в конкретном действии. Теперь я попытался сделать этот метод статическим и, следовательно, доступным, но что-то говорит мне, что это очень плохая идея.Связь между BroadcastReceiver и Activity - android

Соответственно, я попытался создать экземпляр вещательного приемника внутри своей активности, не объявив его в своем манифесте, но проблема в том, что - когда приложение выключено, активность не существует и поэтому я не могу вызвать мой метод.

Итак, мой вопрос: как я могу вызвать этот метод, когда широковещательный приемник загорается, не делая его «общедоступным»?

Вот мой код вида деятельности (я удалил ненужные части)

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

, когда и принять вызов ваш applicaiton это превращается в background.so, что и будет делать с деятельностью (если ур приложение в фоновом режиме) ?? – KomalG

+0

Этот метод обязательно должен быть внутри класса 'Activity'? – mangusta

+0

Что этот метод будет делать? – Chandrakanth

ответ

4

Это может помочь: how can I notify a running activity from a broadcast receiver?

Кроме того, вы можете попробовать использовать Observers

Что-то вроде:

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

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

В вашей трансляции повторно синонимов употребляются:

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

и активность:

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

Функция обновления не набирается :( –

33

Вы можете использовать наблюдателей, как

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

Приемник может использоваться через манифест. ObservableObject - должен быть одноточечным.

+0

Удивительный чувак. Хорошая работа. Это работает для меня – Amir

+0

Отличный ответ! Мне нравится использовать шаблоны проектирования) – Sermilion

+1

Какова польза от использования статической переменной? Я имею в виду, что синглтон все равно статичен, не так ли? – JohnyTex