1. 描述:当FM service监听到某个Receiver,需要前台更新UI时
2. 实例:手机切换飞行模式,
//dongyang.li add for airplane mode.
if(getAirplaneMode(getApplicationContext())) {
mIsPowerUping = false;
bundle = new Bundle(5);
bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_AIRPLANE_MODE);
bundle.putBoolean(FmRadioListener.FLAG_AIRPLANE_MODE, true);
notifyActivityStateChanged(bundle);
return;
}
private class FmServiceBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String command = intent.getStringExtra("command");
if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)){
boolean isAirPlaneMode = intent.getBooleanExtra("state",false);
if(isAirPlaneMode){
if (mIsPowerUp) {
powerDown();
}
}
else{
if (!mIsPowerUp) {
tuneStation(FmRadioUtils.computeFrequency(getFrequency()));
}
}
}
3. ACTION_AIRPLANE_MODE_CHANGED在Intent.java中有定义
public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
4. notifyActivityStateChanged()
// record the listener list, will notify all listener in list
private ArrayList<Record> mRecords = new ArrayList<Record>();
/**
* Register FM Radio listener, activity get service state should call this
* method register FM Radio listener
*
* @param callback FM Radio listener
*/
public void registerFmRadioListener(FmRadioListener callback) {
synchronized (mRecords) {
// register callback in AudioProfileService, if the callback is
// exist, just replace the event.
Record record = null;
int hashCode = callback.hashCode();
final int n = mRecords.size();
for (int i = 0; i < n; i++) {
record = mRecords.get(i);
if (hashCode == record.mHashCode) {
return;
}
}
record = new Record();
record.mHashCode = hashCode;
record.mCallback = callback;
mRecords.add(record);
}
}
private void remove(int hashCode) {
synchronized (mRecords) {
Iterator<Record> iterator = mRecords.iterator();
while (iterator.hasNext()) {
Record record = (Record) iterator.next();
if (record.mHashCode == hashCode) {
iterator.remove();
}
}
}
}
/**
* Call back from service to activity
*
* @param bundle The message to activity
*/
private void notifyActivityStateChanged(Bundle bundle) {
if (!mRecords.isEmpty()) {
Log.d(TAG, "notifyActivityStatusChanged:clients = " + mRecords.size());
synchronized (mRecords) {
Iterator<Record> iterator = mRecords.iterator();
while (iterator.hasNext()) {
Record record = (Record) iterator.next();
FmRadioListener listener = record.mCallback;
if (listener == null) {
iterator.remove();
return;
}
listener.onCallBack(bundle);
}
}
}
}