zoukankan      html  css  js  c++  java
  • Android FM模块学习之四源码分析(3)

    接着看FM模块的其他几个次要的类的源码。这样来看FM上层的东西不是太多。

    请看androidvendorqcomopensourcefmfmapp2srccomcaffmradioSettings.java

    protected void onCreate(BundlesavedInstanceState)

    从FMRadio.java用使用Intent跳转携带参数过来,在onCreate获取携带数据。

    protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              Intent intent = getIntent();
              if (intent != null) {
                  mRxMode = intent.getBooleanExtra(RX_MODE, false);
              }
              mPrefs = new FmSharedPreferences(this);
              if (mPrefs != null) {
                  setPreferenceScreen(createPreferenceHierarchy());
              }
     }

    private PreferenceScreen createPreferenceHierarchy() 初始化创建收音机设置里显示控件

    private PreferenceScreen createPreferenceHierarchy() {
              int index = 0;
              if (mPrefs == null) {
                  return null;
              }
              // Root
              PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
                                    this);
    
               summaryBandItems = getResources().getStringArray(
                                    R.array.regional_band_summary);
               chSpacingItems = getResources().getStringArray(
                                    R.array.channel_spacing_entries);
               mBandPreference = new ListPreference(this);
               mBandPreference.setEntries(R.array.regional_band_entries);
               mBandPreference.setEntryValues(R.array.regional_band_values);
               mBandPreference.setDialogTitle(R.string.sel_band_menu);
               mBandPreference.setKey(REGIONAL_BAND_KEY);
               mBandPreference.setTitle(R.string.regional_band);index = FmSharedPreferences.getCountry();
               Log.d(LOGTAG, "createPreferenceHierarchy: Country: " + index);
               // Get the preference and list the value.
               if ((index < 0) || (index >= summaryBandItems.length)) {
                    index = 0;
               }
               mBandPreference.setValueIndex(index);
               root.addPreference(mBandPreference);
    
               mChannelSpacingPref = new ListPreference(this);
               mChannelSpacingPref.setEntries(R.array.channel_spacing_entries);
               mChannelSpacingPref.setEntryValues(R.array.channel_spacing_val);
               mChannelSpacingPref.setDialogTitle(R.string.sel_chanl_spacing);
               mChannelSpacingPref.setTitle(R.string.chanl_spacing);
               mChannelSpacingPref.setKey(CHAN_SPACING_KEY);
    
               mUserBandMinPref = new EditTextPreference(this);
               mUserBandMinPref.setKey(USER_DEFINED_BAND_MIN_KEY);
               mUserBandMinPref.setTitle(R.string.usr_def_band_min);
               mUserBandMinPref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER |
                                                            InputType.TYPE_NUMBER_FLAG_DECIMAL);
               mUserBandMinPref.setDialogTitle(R.string.usr_def_band_min);
    
               mUserBandMaxPref = new EditTextPreference(this);
               mUserBandMaxPref.setKey(USER_DEFINED_BAND_MAX_KEY);
               mUserBandMaxPref.setTitle(R.string.usr_def_band_max);
               mUserBandMaxPref.setDialogTitle(R.string.usr_def_band_max);
               mUserBandMaxPref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER |
                                                            InputType.TYPE_NUMBER_FLAG_DECIMAL);
    
               setBandSummary(index);
     
               if (mRxMode) {
                   // Audio Output (Stereo or Mono)
                   summaryAudioModeItems = getResources().getStringArray(
                                            R.array.ster_mon_entries);
                   mAudioPreference = new ListPreference(this);
                   mAudioPreference.setEntries(R.array.ster_mon_entries);
                   mAudioPreference.setEntryValues(R.array.ster_mon_values);
                   mAudioPreference.setDialogTitle(R.string.sel_audio_output);
                   mAudioPreference.setKey(AUDIO_OUTPUT_KEY);
                   mAudioPreference.setTitle(R.string.aud_output_mode);
                   boolean audiomode = FmSharedPreferences.getAudioOutputMode();
                   if (audiomode) {
                       index = 0;
                   } else {
                       index = 1;
                   }
                   Log.d(LOGTAG, "createPreferenceHierarchy: audiomode: " + audiomode);
                   mAudioPreference.setSummary(summaryAudioModeItems[index]);
                   mAudioPreference.setValueIndex(index);
     
                   // AF Auto Enable (Checkbox)
                   mAfPref = new CheckBoxPreference(this);
                   mAfPref.setKey(AUTO_AF);
                   mAfPref.setTitle(R.string.auto_select_af);
                   mAfPref.setSummaryOn(R.string.auto_select_af_enabled);
                   mAfPref.setSummaryOff(R.string.auto_select_af_disabled);
                   boolean bAFAutoSwitch = FmSharedPreferences.getAutoAFSwitch();
                   Log.d(LOGTAG, "createPreferenceHierarchy: bAFAutoSwitch: "
                                  + bAFAutoSwitch);
                   mAfPref.setChecked(bAFAutoSwitch);
                   root.addPreference(mAfPref);
    
                 if(FMRadio.RECORDING_ENABLE) {
                      summaryRecordItems = getResources().getStringArray(
                       R.array.record_durations_entries);
                    int nRecordDuration = 0;
                    mRecordDurPreference = new ListPreference(this);
                    mRecordDurPreference.setEntries(R.array.record_durations_entries);
                    mRecordDurPreference.setEntryValues(R.array.record_duration_values);
                    mRecordDurPreference.setDialogTitle(R.string.sel_rec_dur);
                    mRecordDurPreference.setKey(RECORD_DURATION_KEY);
                    mRecordDurPreference.setTitle(R.string.record_dur);
                    nRecordDuration = FmSharedPreferences.getRecordDuration();
                    Log.d(LOGTAG, "createPreferenceHierarchy: recordDuration: "
                            + nRecordDuration);
                    switch(nRecordDuration) {
                    case FmSharedPreferences.RECORD_DUR_INDEX_0_VAL:
                         index = 0;
                         break;
                    case FmSharedPreferences.RECORD_DUR_INDEX_1_VAL:
                         index = 1;
                         break;
                    case FmSharedPreferences.RECORD_DUR_INDEX_2_VAL:
                         index = 2;
                         break;
                    case FmSharedPreferences.RECORD_DUR_INDEX_3_VAL:
                         index = 3;
                         break;
                    }
                    // Get the preference and list the value.
                    if ((index < 0) || (index >= summaryRecordItems.length)) {
                       index = 0;
                    }
                    Log.d(LOGTAG, "createPreferenceHierarchy: recordDurationSummary: "
                        + summaryRecordItems[index]);
                    mRecordDurPreference.setSummary(summaryRecordItems[index]);
                    mRecordDurPreference.setValueIndex(index);
                    root.addPreference(mRecordDurPreference);
                 }
              }
              mRestoreDefaultPreference = new Preference(this);
              mRestoreDefaultPreference.setTitle(
                                           R.string.settings_revert_defaults_title);
              mRestoreDefaultPreference.setKey(RESTORE_FACTORY_DEFAULT);
              mRestoreDefaultPreference
                                    .setSummary(R.string.settings_revert_defaults_summary);
              mRestoreDefaultPreference.setOnPreferenceClickListener(this);
              root.addPreference(mRestoreDefaultPreference);
              return root;
    }

    public void clearStationList()清除显示列表的电台。

    public void clearStationList() {
              SharedPreferences sp = getSharedPreferences(FMRadio.SCAN_STATION_PREFS_NAME, 0);
              SharedPreferences.Editor editor = sp.edit();
              editor.clear();
              editor.commit();
    }


    public void onSharedPreferenceChanged(SharedPreferencessharedPreferences, String key) ListPerences的监听事件,电台信息改变

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                            String key) {
              int mTunedFreq = 0;
              boolean bStatus = false;
              if (key.equals(REGIONAL_BAND_KEY)) {
                  int curListIndex = FmSharedPreferences.getCurrentListIndex();
                  PresetList curList = FmSharedPreferences.getStationList(curListIndex);
                  String valueStr = sharedPreferences.getString(key, "");
                  int index = 0;
                  if(valueStr != null) {
                      index = mBandPreference.findIndexOfValue(valueStr);
                  }
                  if((index < 0) || (index >= summaryBandItems.length)) {
                      index = 0;
                      mBandPreference.setValueIndex(0);
                  }else if((index + 1) == summaryBandItems.length) {
                       mChannelSpacingPref.setEnabled(true);
                  }else {
                       mChannelSpacingPref.setEnabled(false);
                  }
                  Log.d(LOGTAG, "onSharedPreferenceChanged: Country Change: "
                                                            + index);
                  FmSharedPreferences.setCountry(index);
                  setBandSummary(index);
                  sendSettingsChangedIntent(FM_BAND_CHANGED);
                  if (curList != null) {
                      curList.clear();
                  }
                  clearStationList();
               }else if(key.equals(CHAN_SPACING_KEY)) {
                   int curListIndex = FmSharedPreferences.getCurrentListIndex();
                   PresetList curList = FmSharedPreferences.getStationList(curListIndex);
                   String valStr = mChannelSpacingPref.getValue();
                   int index = 0;
                   if(valStr != null) {
                      index  = mChannelSpacingPref.findIndexOfValue(valStr);
                   }
                   if ((index < 0) || (index >= chSpacingItems.length)) {
                       index = 0;
                       mChannelSpacingPref.setValueIndex(0);
                   }
                   mChannelSpacingPref.setSummary(chSpacingItems[index]);
                   FmSharedPreferences.setChSpacing(2 - index);
                   sendSettingsChangedIntent(FM_CHAN_SPACING_CHANGED);
                   if(curList != null) {
                      curList.clear();
                   }
                   clearStationList();}else if(key.equals(USER_DEFINED_BAND_MIN_KEY)) {
                   String valStr = mUserBandMinPref.getText();
                   double freq = 0;
                   try {
                        freq = Double.parseDouble(valStr) * 1000;
                   }catch(NumberFormatException e) {
                        e.printStackTrace();
                        return;
                   }
                   max_freq = FmSharedPreferences.getUpperLimit();
                   min_freq = FmSharedPreferences.getLowerLimit();
                   if((freq > 0) && (freq < max_freq) && (freq >= 76000)) {
                      FmSharedPreferences.setLowerLimit((int)freq);
                      sendSettingsChangedIntent(FM_BAND_CHANGED);
                      setBandSummary(summaryBandItems.length - 1);
                      clearStationList();
                   }else {
                      Toast.makeText(this, getString(R.string.user_defind_band_msg),
                                                                Toast.LENGTH_SHORT).show();
                   } }else if(key.equals(USER_DEFINED_BAND_MAX_KEY)) {
                   String valStr = mUserBandMaxPref.getText();
                   double freq = 0;
                   try {
                        freq = Double.parseDouble(valStr) * 1000;
                   }catch(NumberFormatException e) {
                        e.printStackTrace();
                        return;
                   }
                   min_freq = FmSharedPreferences.getLowerLimit();
                   max_freq = FmSharedPreferences.getUpperLimit();
                   if((freq > 0) && (freq > min_freq) && (freq <= 108000)) {
                      FmSharedPreferences.setUpperLimit((int)freq);
                      sendSettingsChangedIntent(FM_BAND_CHANGED);
                      setBandSummary(summaryBandItems.length - 1);
                      clearStationList();
                   }else {
                      Toast.makeText(this, getString(R.string.user_defind_band_msg),
                                                                Toast.LENGTH_SHORT).show();
                   }
              }else {
                  if(mRxMode) { if (key.equals(AUTO_AF)) {
                         boolean bAFAutoSwitch = mAfPref.isChecked();
                         Log.d(LOGTAG, "onSharedPreferenceChanged: Auto AF Enable: "
                                                   + bAFAutoSwitch);
                         FmSharedPreferences.setAutoAFSwitch(bAFAutoSwitch);
                         mPrefs.Save();
                         sendSettingsChangedIntent(FM_AF_OPTION_CHANGED);
                     }else if(key.equals(RECORD_DURATION_KEY)) {
                         if(FMRadio.RECORDING_ENABLE) {
                            String valueStr = mRecordDurPreference.getValue();
                            int index = 0;
                            if (valueStr != null) {
                                index = mRecordDurPreference.findIndexOfValue(valueStr);
                            }
                              if ((index < 0) || (index >= summaryRecordItems.length)) {
                                 index = 0;
                                 mRecordDurPreference.setValueIndex(index);
                            }
                            Log.d(LOGTAG, "onSharedPreferenceChanged: recorddur: "
                                         + summaryRecordItems[index]);
                              mRecordDurPreference.setSummary(summaryRecordItems[index]);
                              FmSharedPreferences.setRecordDuration(index);
                           }
                       } else if (key.equals(AUDIO_OUTPUT_KEY)) {String valueStr = mAudioPreference.getValue();
                           int index = 0;
                           if (valueStr != null) {
                               index = mAudioPreference.findIndexOfValue(valueStr);
                           }
                           if (index != 1) {
                              if (index != 0) {
                                  index = 0;
                                  /* It shud be 0(Stereo) or 1(Mono) */
                                  mAudioPreference.setValueIndex(index);
                              }
                           }
                           Log.d(LOGTAG, "onSharedPreferenceChanged: audiomode: "
                                          + summaryAudioModeItems[index]);
                           mAudioPreference.setSummary(summaryAudioModeItems[index]);
                         if (index == 0) {
                             // Stereo
                             FmSharedPreferences.setAudioOutputMode(true);
                         }else {
                             // Mono
                             FmSharedPreferences.setAudioOutputMode(false);
                         }
                         mPrefs.Save();
                         sendSettingsChangedIntent(FM_AUDIO_MODE_CHANGED);
                     }
                  }
              }
              if (mPrefs != null) {
                  if(bStatus) {
                     mPrefs.Save();
                  }else {
                     mTunedFreq = FmSharedPreferences.getTunedFrequency();
                     if (mTunedFreq > FmSharedPreferences.getUpperLimit() ||
                              mTunedFreq < FmSharedPreferences.getLowerLimit()) {
                         FmSharedPreferences.setTunedFrequency(
                              FmSharedPreferences.getLowerLimit());
                     }
                     mPrefs.Save();
                  }
              }
     }

    public boolean onPreferenceClick(Preferencepreference) 收音机恢复出厂设置监听事件,后fm播放状态显示对话框,调用restoreSettingsDefault()存入初始化数据。

    public boolean onPreferenceClick(Preference preference) {
              boolean handled = false;
              if (preference == mRestoreDefaultPreference) {
                  showDialog(RESTORE_FACTORY_DEFAULT_INT);
              }
              return handled;
     }

    ListPreferences属性注册:

     private void restoreSettingsDefault() {
              if (mPrefs != null) {
                 if (Locale.getDefault().equals(Locale.CHINA)) {
                     mBandPreference
                            .setValueIndex(FmSharedPreferences.REGIONAL_BAND_CHINA);
    		}else{				
                     mBandPreference
                            .setValueIndex(FmSharedPreferences.REGIONAL_BAND_INDONESIA);
                 }
                 if (mRxMode) { mAudioPreference.setValueIndex(0);
                    if (FMRadio.RECORDING_ENABLE) {
                        mRecordDurPreference.setValueIndex(0);
                    }
                    mAfPref.setChecked(true);
                    FmSharedPreferences.SetDefaults();
                 }else {
                    if (Locale.getDefault().equals(Locale.CHINA)) {
                        FmSharedPreferences
                        .setCountry(FmSharedPreferences.REGIONAL_BAND_CHINA);				
                 }else{FmSharedPreferences
                        .setCountry(FmSharedPreferences.REGIONAL_BAND_INDONESIA);
                    }
                 }
                 mPrefs.Save();
              }
    }


    onResume()方法

    protected void onResume() {
              super.onResume();
              PreferenceScreen preferenceScreen = getPreferenceScreen();
              SharedPreferences sharedPreferences = null;
              if (preferenceScreen != null) {
                  sharedPreferences = preferenceScreen.getSharedPreferences();
              }
              if (sharedPreferences != null) {
                  sharedPreferences.registerOnSharedPreferenceChangeListener(this);
              }
     }


    haredPreferences.registerOnSharedPreferenceChangeListener(this);进行注册

    protected void onPause()方法

    protected void onPause() {
              super.onPause();
              PreferenceScreen preferenceScreen = getPreferenceScreen();
              SharedPreferences sharedPreferences = null;
              if (preferenceScreen != null) {
                  sharedPreferences = preferenceScreen.getSharedPreferences();
              }
              if (sharedPreferences != null) {
                  sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
              }
    }


    sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);卸载注册

    private void setBandSummary(int index) 设置ListPreference控件选择地区频率范围后现实在控件上

    private void setBandSummary(int index) {
               if((index + 1) == summaryBandItems.length) {
                  min_freq = FmSharedPreferences.getLowerLimit();
                  max_freq = FmSharedPreferences.getUpperLimit();
                  chan_spacing = FmSharedPreferences.getChSpacing();
                  if(chan_spacing < 0) {
                     chan_spacing = 0;
                  }
                  mBandPreference.setSummary(summaryBandItems[index] + "( "
                           + (min_freq / 1000.0) +"Mhz To " + (max_freq / 1000.0) +
                           "Mhz)");
                  mChannelSpacingPref.setValueIndex(2 - chan_spacing);
                  mChannelSpacingPref.setSummary(chSpacingItems[2 - chan_spacing]);
                  mChannelSpacingPref.setEnabled(true);
                  mUserBandMinPref.setEnabled(true);mUserBandMaxPref.setEnabled(true);
                  mUserBandMinPref.setSummary((min_freq / 1000.0) + "Mhz");
                  mUserBandMaxPref.setSummary((max_freq / 1000.0) + "Mhz");
               }else {
                  mBandPreference.setSummary(summaryBandItems[index]);
                  mChannelSpacingPref.setEnabled(false);
                  mUserBandMinPref.setEnabled(false);
                  mUserBandMaxPref.setEnabled(false);
               }
    }


       private void displayToast(String msg)实现Toast提示

    private void displayToast(String msg) {
          Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
    }


    private void sendSettingsChangedIntent(intaction) 发送广播action活动状态,

    在FMRadio.java的registerFMSettingListner()方法接受(每次走 FMRadio.java的activity都会接受下广播)。

    private void sendSettingsChangedIntent(int action) {
               Intent intent = new Intent(ACTION_FM_SETTING);
               intent.putExtra("state", action);
               Log.d(LOGTAG, "Sending  FM SETTING Change intent for = " + action);
               getApplicationContext().sendBroadcast(intent);
    }


    总结:比较简单,过一遍即可。
  • 相关阅读:
    overflow:hidden三个作用
    git提交代码步骤以及创建issue事项
    Vue3.0中setup函数的使用
    样式rpx
    js函数
    数据类型
    进制转换
    事件绑定
    微信小程序基础
    “AI+”改变世界!不同领域的5大人工智能趋势
  • 原文地址:https://www.cnblogs.com/kings-boke/p/4270926.html
Copyright © 2011-2022 走看看