超强干货Android 基础知识 设备兼容+内外部储存+系统权限+(+∞)

1. 设备兼容性分类

兼容性分类主要分: 硬件兼容性,软件兼容性两大类。

2. 硬件设备兼容

不同厂商(比如:手机厂商)生产不同尺寸的设备,此时,设备要兼容不同类型的APP,Google也对此有强烈的要求,国外手机,必须通过CTS (兼容性测试)才可以上市售卖。国内手机由于没有预制GMS包,不用测试兼容性,故,有时候小厂商生产的手机在兼容性上可能不太完美。

3. 软件 APP 兼容

作为 APP开发者,APP兼容性是必须的。兼容不同Feature,兼容不同语言、兼容不同屏幕尺寸、兼容不同分辨率,兼容不同SDK版本等

4. 兼容不同语言

为了更加国际化,APP通常会兼容不同国家语言,最基本的是兼容英文,简体中文,繁体中文等

  1. 文件名称命名规则如下:

values-ISO语言代码

2 .使用语法:

java :
R.string.<string_name> 引用字符串资源

XML :
@string/<string_name>

常用语言如下:

 简体中文 values-zh-rCN
 繁体中文 values-zh-rTW 、values-zh-rHK
 美式英文 values
 英文    values-en-rGB
 等等...
  1. 兼容不容语言举例

                                                                                             

Android兼容不同国家语言

5.兼容不同分辨率

Android 运行在不同的设备上,比如手机、TV、Car等设备载体。为了分类这些载体,Android 设备分两大类:

  1. 屏幕大小

物理尺寸上的大小 区分如下:
small, normal, large, and xlarge

  1. 屏幕密度(DPI)

屏幕像素的物理密度,区分如下:
mdpi (medium), hdpi (hdpi), xhdpi (extra high), xxhdpi (extra-extra high), and others

  1. UI 标准化,常用图片兼容性总结

开发过程中适应不同图片时候的参考总结

密度 建议尺寸 手机屏幕密度DPI 图片分辨率 基准图缩放倍数
drawable-mdpi 48 * 48 120dpi ~ 160dpi 320x480 1.0
drawable-hdpi 72 * 72 160dpi ~ 240dpi 480x800、480x854 1.5
drawable-xhdpi 96 * 96 240dpi ~ 320dpi 960*720 2.0
drawable-xxhdpi 144 * 144 320dpi ~ 480dpi 1280×720 3.0
drawable-xxxhdpi 192 * 192 480dpi ~ 640dpi 1920*1080 4.0

手机屏幕密度DPI获取方法

float xdpi = getResources().getDisplayMetrics().xdpi;
float ydpi = getResources().getDisplayMetrics().ydpi;
  1. 兼容屏幕分辨率举例

                                                                                           

                                                                                             兼容不同屏幕分辨率

                                                                                                

 

                                                                                               Android Studio推荐方法

6. 兼容不同屏幕方向布局(横向 landscape 、纵向 portrait)

虽然Android 在横竖屏切换的时候可以自适应,但是,效果经常不是太好,为了更好适应手机屏幕的旋转,横屏、竖屏需要不同的布局,进一步提升UI交互体验。

例如:

布局 适应屏幕
layout 默认纵向
layout-land 横向布局
layout-large 大屏纵向
layout-large-land 大屏横向
layout-sw600dp 双窗口布局,常用平板
layout-sw600dp-land 双窗口布局,常用横向 平板
layout-sw720dp 双窗口布局,常用平板

 

7. 兼容不同硬件 Feature

为了兼顾不同的手机版本,在应用使用不同的Feature时候进行判断是否支持,这样会更好的提升用户体验。
比如有些低配手机会没有陀螺仪等Feature,此时APK要兼容不容的硬件Feature。

例如:在AndroidManifest文件中声明使用Feature

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

然后在使用该Feature 功能时候进行判断取舍

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device does not have a compass, turn off the compass feature
    disableCompassFeature();
}

8. 兼容不同SDK平台

不同的设备会运行在不同的Android版本上,比如Android 2.、Android 4. 、Android 5.* 、Android6.* 、Android 7.* 、Android 8.* 。

创建工程时候,在AndroidManifest文件中可以选择APP 要兼容的Android版本

<manifest ... >
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
    ...
</manifest>

当然也可以在java代码中动态判断当前设备版本,进而执行不同的代码。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag/drop features that use ClipboardManager APIs
    disableDragAndDrop();
}

至此,Android系统的兼容性已基本结束,通过适配APP兼容性,是应用更强壮。

有需要的可以私信我或加入我们交流群:936903570

1.Preference 简介

  • Preference 继承关系

java.lang.Object
    ↳ android.preference.Preference 

Preference 常用于APP 设置模块,比如 Android 系统中的Settings 模块,它可以默认把我们的数据保存在SharePreference中。

                                              

settings中常用Preference 举例

  • 键值对获取方法同SharePreference

SharedPreferences mSp = PreferenceManager.getDefaultSharedPreferences(this);
String favPhone=mSp.getString(PREF_LISTPHONE, "MI");
  • Prefernce 数据保存

Preference通过key-values 键值对的形式保存在/data/data/包名/shared_prefs/包名_preferences.xml

 

2. Perference 使用方法

一般在XML文件夹中创建xml 文件来对Settings进行布局,布局文件中通常使用PreferenceScreen容器,PreferenceScreen 包含多个 Preference 控件,PreferenceCategory 可以设置分类标题。

常用Preference 控件如下:
PreferenceScreen
CheckBoxPreference
EditTextPreference
ListPreference
PreferenceCategory
RingtonePreference.

上面控件等同Layout布局中的View,PreferenceScreen 等同Layout布局中的ViewGroup。在Android 3.0 之前需要继承PreferenceActivity(此方法不是太推荐使用,已被启用),3.0 之后更高版本,则需要继承Activity,使用Fragment 控制布局,然后实现不同控件的处理事件。

Perference 常用使用方法如下两种:

  •  

    1. 使用XML定义Preference

  •  

    1. 使用Fragment 定义Preference

3. 使用XML定义Preference

此方法有点过时,不太建议使用,但目前还可以用。
其使用方法如下:

  1. 将XML 文件保存在 res/xml/ 目录中 例如: preferences.xml

  2. 继承PreferenceActivity在 oncreate方法中直接调用addPreferencesFromResource(R.xml.preference);添加布局

  3. 点击事件处理setOnPreferenceClickListener ,内容发生改变事件处理 setOnPreferenceChangeListener

Demo 如下:
preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <Preference
        android:key="about_phone"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />

    <RingtonePreference
        android:key="pref_ring"
        android:summary="@string/pref_ringtone_tittle"
        android:title="@string/pref_ringtone_sum" />

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="pref_blue"
        android:summary="@string/preference_blue_sum"
        android:title="@string/preference_blue_tittle" />

    <PreferenceCategory
        android:key="pref_fav_category"
        android:title="@string/pref_fav_category_tittle" >
        <EditTextPreference
            android:key="fav_city"
            android:summary="@string/pref_ed_name_sum"
            android:title="@string/pref_ed_name_tittle" />

        <ListPreference
            android:defaultValue="@array/fav_phone"
            android:dialogTitle="@string/pref_fav_title"
            android:entries="@array/fav_phone"
            android:entryValues="@array/fav_phone"
            android:key="pref_fav_phone"
            android:summary="@string/pref_fav_sum"
            android:title="@string/pref_fav_title" />
    </PreferenceCategory>
    <PreferenceCategory
        android:key="pref_contact_category"
        android:title="@string/pref_fav_contact_tittle" />

    <PreferenceScreen
        android:key="pre_voicemail_setting_key"
        android:persistent="false"
        android:title="@string/pref_voicemail_tittle" >
        <Preference
            android:key="voice_mail"
            android:summary="@string/pref_voicemail_tittle"
            android:title="@string/pref_voicemail_sum" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        </Preference>
    </PreferenceScreen>

</PreferenceScreen>

Activity 处理方法

public class PreferenceMethods extends PreferenceActivity implements OnPreferenceClickListener, OnPreferenceChangeListener {
    
    public static final String PREF_BLUE="pref_blue";
    public static final String PREF_LISTPHONE="pref_fav_phone";
    public static final String PREF_CITY="fav_city";
    public static final String PREF_RING="pref_ring";
    
    private CheckBoxPreference  mBlueCheckPreference;
    private ListPreference mFavPhoneListPreference;
    private EditTextPreference mFavCityEdPreference;
    private RingtonePreference mRingtonePreference;
    private SharedPreferences mSp;
    boolean isCheck;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        
        mSp = PreferenceManager.getDefaultSharedPreferences(this);
        
        isCheck = mSp.getBoolean(PREF_BLUE, true);
        String favPhone=mSp.getString(PREF_LISTPHONE, "MI");
        
        mBlueCheckPreference=(CheckBoxPreference) findPreference(PREF_BLUE);
        mFavPhoneListPreference=(ListPreference) findPreference(PREF_LISTPHONE);
        mFavCityEdPreference=(EditTextPreference) findPreference(PREF_CITY);
        mRingtonePreference=(RingtonePreference) findPreference(PREF_RING);
        
        mFavPhoneListPreference.setSummary(favPhone);
        mFavPhoneListPreference.setOnPreferenceClickListener(this);
        mFavPhoneListPreference.setOnPreferenceChangeListener(this);
        
        mBlueCheckPreference.setChecked(isCheck);
        mBlueCheckPreference.setOnPreferenceClickListener(this);
        mBlueCheckPreference.setOnPreferenceChangeListener(this);
        
        String favCity=mSp.getString(PREF_CITY, "成都");
        mFavCityEdPreference.setOnPreferenceClickListener(this);
        mFavCityEdPreference.setOnPreferenceChangeListener(this);
        mFavCityEdPreference.setSummary(favCity);
        
        String favRingtone=mSp.getString(PREF_RING, "十年");
        mRingtonePreference.setSummary(favRingtone);
        mRingtonePreference.setOnPreferenceChangeListener(this);
        mRingtonePreference.setOnPreferenceClickListener(this);
    }
    @Override
    public boolean onPreferenceClick(Preference preference) {
        return true;
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        
        if (mBlueCheckPreference.equals(preference)) {
            isCheck=!isCheck;
            mBlueCheckPreference.setChecked(isCheck);
        }
        
        if (mFavPhoneListPreference.equals(preference)) {
            mFavPhoneListPreference.setSummary(newValue.toString(
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值