今天收获特别大,为了使用稳定的wifi设置,只能去提取系统中的wifi模块代码,现在除了加密和解密等,其他已经工作正常了,在此写一下其中遇到的困难和学习到的东西:
1.   Preferencescreen中启动activity
这个让我很吃惊,由于以前都是自己编程,从来没考虑到Preferencescreen还能够启动activity的功能,下面来看看它是怎么启动的,该文件名为wireless_setting.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.seedshope.android">
    <!-- Programmatically will have dynamic summary, but we provide the fallback summary. -->
    <PreferenceScreen
        android:key="wifi_settings"
        android:title="@string/wifi_settings"
        android:summary="@string/wifi_settings_summary" >
        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.seedshope.android"
            android:targetClass="com.seedshope.android.wifi.WifiSettings" />
    </PreferenceScreen>
</PreferenceScreen>

其中com.seedshope.android是工程的包名,com.seedshope.android.wifi.WifiSettings是要启动的类。
一般情况下,这样就ok了,点击对应的Preference就能够启动对应的activity,然而仅仅这样有时这样,并不一定能够启动对应的activity,今天我追了这个问题达3个小时之久,最终看代码发现了一个问题

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
       if ( (preference == mAirplaneModePreference) &&
                (Boolean.parseBoolean(
                    SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) ) {
            // In ECM mode launch ECM app dialog
           startActivityForResult(
                new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
                REQUEST_CODE_EXIT_ECM);
            return true;
        }
        else {
            // Let the intents be launched by the Preference manager
            return false;
       }
    }
   其中WirelessSetting.java中有如上函数,当返回值为true时,你怎么点击Preference也是无济于事,等吧,等到天亮了,都等不到跳转到对应的activity,只有等到它的返回值为false的时候,才可以正常跳转.
    因此要使一个Preference能够正常跳转到另外一个activity,有两个条件,一是xml里面是否设置正确,第二是调用该xml的java类是否在onPreferenceTreeClick这个函数有正确的设置.

2. 定制Preferece风格
Android的Setting里面有对Preference进行文字和图片混合布置,下面我从(Settings.xml)截取了一小段,如下所示
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res/com.seedshope.android"
    android:title="@string/settings_label"
    android:key="parent">

        <com.seedshope.android.IconPreferenceScreen
            android:title="@string/radio_controls_title"
            settings:icon="@drawable/ic_settings_wireless">
            <intent
                android:action="android.intent.action.MAIN"
                android:targetPackage="com.seedshope.android"
                android:targetClass="com.seedshope.android.WirelessSettings" />
        </com.seedshope.android.IconPreferenceScreen>
</PreferenceScreen>

其中com.seedshope.android.IconPreferenceScreen就是自己定制的风格,其实一个java类,在android系统的路径为com.android.settings.IconPreferenceScreen.也就是packages/apps/Settings/src/com/android/settings/IcomPreferenceScreen.java文件,该文件内容如下:

public class IconPreferenceScreen extends Preference {

    private Drawable mIcon;

    public IconPreferenceScreen(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public IconPreferenceScreen(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setLayoutResource(R.layout.preference_icon);
        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.IconPreferenceScreen, defStyle, 0);
        mIcon = a.getDrawable(R.styleable.IconPreferenceScreen_icon);
    }

    @Override
    public void onBindView(View view) {
        super.onBindView(view);
        ImageView imageView = (ImageView) view.findViewById(R.id.icon);
        if (imageView != null && mIcon != null) {
            imageView.setImageDrawable(mIcon);
        }
    }
}
首先继承了Preference,
posted on 2010-03-29 21:34 seedshopezhong 阅读(4217) 评论(1)  编辑 收藏 引用 所属分类: Android

评论:
# re: android系统中的wifi设置提取 2010-07-27 17:11 | lhf059
看不明白~能详细点吗?怎么调用系统的设置界面呢?  回复  更多评论
  
只有注册用户登录后才能发表评论。