2014-03-01 4 views
2

Учимся использовать класс BroadcastReceiver в Android, я написал небольшую программу, чтобы получить состояние заряда батареи и записать ее в три поля TextView в действии.Могу ли я использовать метод обратного вызова из BroadcastReceiver?

Однако я сделал BroadcastReceiver отдельным классом, чтобы сделать его более простым и отдельным от активности. Поэтому я должен найти способ сообщить классу Activity, что данные батареи были обновлены или, что является моим решением, передать ссылки на поля TextView из класса Activity в BroadcastReceiver.

Кто-нибудь знает, можно ли сделать метод обратного вызова из BroadcastReceiver для запуска функции, f.ex. updateTextViews(); в деятельности?

Вот исходный код - обратите внимание, есть два Java файлы: http://pastebin.com/qjCTsSuH

С уважением, Нильс.

ответ

2

Я сделал BroadcastReceiver как отдельный класс, чтобы сделать его более простым

ИМХО, вы сделали его более сложным.

Поэтому я должен найти способ, чтобы сказать мой класс активности, что данные батареи были обновлены, или, что мое решение, чтобы передать ссылки на TextView полях от деятельности к классу BroadcastReceiver.

Вариант № 1: вернитесь к использованию внутреннего класса для BroadcastReceiver. ACTION_BATTERY_CHANGED может использоваться только через registerReceiver() в любом случае. Просто имейте onReceive() вызов некоторого метода в действии, чтобы выполнить работу по обновлению пользовательского интерфейса.

Вариант № 2: Передайте свою деятельность в конструктор BroadcastReceiver и вызовите метод, как в опции №1.

Вариант № 3: Используйте автобус событий, например, Square's Otto или EventBus от greenrobot.

+0

Спасибо. Теперь с помощью опции №2. – skovmand

+0

Если у вас есть много трансляций для приема в мероприятии, будет ли лучше всего иметь один широковещательный приемник в вашей деятельности и просто иметь много фильтров намерений? – Micro

+0

@MicroR: Ум, наверное. Трудно ответить абстрактно. – CommonsWare

1

То, что сработало для меня, просто объявляет объекты интерфейса статическими. Имейте в виду, что эта статика может вызывать столько проблем, сколько они решаются, поскольку статика сохраняется в разных точках.

public class MainActivity extends AppCompatActivity implements SocketMessageReceiver.ISocketMessageReceiver { 

    //Declare the cb interface static in your activity 
    private static SocketMessageReceiver.ISocketMessageReceiver iSocketMessageReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 

     //Assign this 
     iSocketMessageReceiver = this; 
     socketMessageReceiver.registerCallback(iSocketMessageReceiver); 
    } 

    @Override 
    public void sendSocketMessage(String socketMessage) { 
     lblEchoMessage.setText(socketMessage); 
    } 

} 

И в ресивере ....

public class SocketMessageReceiver extends BroadcastReceiver { 

    interface ISocketMessageReceiver { 
     void sendSocketMessage(String socketMessage); 
    } 

    //Also declare the interface in your BroadcastReceiver as static 
    private static ISocketMessageReceiver iSocketMessageReceiver; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if(intent.getAction().equals("com.WarwickWestonWright.SocketExample.RECEIVE")) { 
      iSocketMessageReceiver.sendSocketMessage(intent.getBundleExtra("DATA").getString("DATA")); 
     } 

    } 

    public void registerCallback(ISocketMessageReceiver iSocketMessageReceiver) { 
     this.iSocketMessageReceiver = iSocketMessageReceiver; 
    } 

} 
+0

Это работало для меня, но единственное, что вы пропустили, - объявить объект socketMessageReceiver в классе MainActivity. – AmJa

Смежные вопросы