Связь между BroadcastReceiver и Activity - андроид
У меня есть широковещательный приемник в моем приложении, который запускается каждый раз, когда пользователь получает входящий звонок. Теперь, когда это произойдет, мне нужен широковещательный приемник для вызова конкретного метода в конкретном действии. Теперь я попытался сделать этот метод статическим и, следовательно, доступным, но что-то говорит мне, что это очень плохая идея.
Соответственно, я попытался создать экземпляр вещательного приемника внутри своей активности, не объявив его в своем манифесте, но проблема в том, что когда приложение отключено, активность не существует и поэтому я не могу вызвать мой метод.
Итак, мой вопрос: как я могу вызвать этот метод при запуске широковещательного приемника, не делая его "public static"?
Вот мой код активности (я удалил ненужные части)
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);
}
}
Ответы
Ответ 1
Вы можете использовать наблюдателей, например
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 - должен быть singleton.
Ответ 2
Это может помочь: как я могу уведомить текущую активность от широковещательного приемника?
Кроме того, вы можете попробовать использовать Наблюдатели
Что-то вроде:
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
}
}
Ответ 3
Если кому-то нужна двусторонняя связь между BroadcastReceiver и Activity, я написал этот класс утилиты, который упрощает вызов методов друг другу, сохраняя при этом безопасность.
https://gist.github.com/Jenjen1324/4a0c03beff827082cb641fc8fe2c4e71