我的应用程序中有一个广播接收器,每次用户接到来电时都会触发。现在,当它发生时,我需要广播接收器来调用特定活动中的特定方法。现在,我尝试将此方法设为静态,因此可用,但有些东西告诉我这是一个非常糟糕的主意。
因此,我尝试在我的活动中实例化广播接收器而不在我的清单中声明它,但问题是 - 当应用程序关闭时,活动不存在,因此我无法调用我的方法。
所以我的问题是 - 当广播接收器被启动时,如何在不使其成为“公共静态”的情况下调用此方法?
这是我的活动代码(我删除了无关的部分)
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 :(得分:49)
你可以使用观察者,比如
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 - 必须是单例。
答案 1 :(得分:6)
这可能会有所帮助: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
}
}
答案 2 :(得分:0)
如果有人需要在BroadcastReceiver和Activity之间进行双向通信,我编写了这个实用程序类,它简化了彼此调用方法,同时仍然是内存安全的。
https://gist.github.com/Jenjen1324/4a0c03beff827082cb641fc8fe2c4e71