主頁 >  其他 > Android 今日頭條螢屏適配詳細使用攻略

Android 今日頭條螢屏適配詳細使用攻略

2020-09-25 09:34:34 其他

螢屏自適應

  • 螢屏適配相關知識點
  • 1. 適配原理
    • 原理核心
    • 優缺點
  • 2. 框配置
  • 3. 自定義初始化
  • 4. 常用方法決議
  • 5. 常見介面及類的使用
    • CustomAdapt
    • CancelAdapt
  • 6.框架核心
    • 1.螢屏適配自定義
    • 2.適配策略的實作
  • 7. 其實事項
  • 總結

首先感謝大神JessYan的創神之作《AndroidAutoSize》,大神以今日頭條螢屏適配的核心代碼為基礎進行了擴展封裝,產生了《AndroidAutoSize》這個能快速接入使用的螢屏適配方案,這個螢屏適配方案是我遇到的截止2020.9.15為止最強大、簡單有效的螢屏適配方案,我已使用該方案有一年,在使用程序未發現有何問題,強烈推薦各位極客們使用學習,

以下是大神JessYan的相關地址:
郵箱:jess.yan.effort@gmail.com
github:https://github.com/JessYanCoding/AndroidAutoSize
簡書:https://www.jianshu.com/p/4aa23d69d481
原始核心代碼:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA

大神的原始碼都在github中各位可以自行下載,我寫這篇博客的目的就是記錄使用心得,并將該框架的重要類和方法使用進行詳細說明,大神的文章中對細節問題寫的比較少,我對其進行了細微的修改和詳細的注解解釋,

螢屏適配相關知識點

像素
通常所說的像素,就是CCD/CMOS上光電感應元件的數量,一個感光元件經過感光,光電信號轉換,A/D轉換等步驟以后,在輸出的照片上就形成一個點,我們如果把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小方點所組成,這些小方點就是構成影像的最小單位“像素”(Pixel),簡而言之,像素就是手機螢屏的最小構成單元,

螢屏尺寸
螢屏尺寸指螢屏的對角線的長度,單位是英寸,1英寸=2.54厘米,比如常見的螢屏尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等

螢屏解析度
螢屏解析度是指在橫縱向上的像素點數,單位是px,1px=1個像素點,一般以縱向像素橫向像素,如19201080

螢屏像素密度(dpi)
螢屏像素密度是指每英寸上的像素點數,單位是dpi,即“dot per inch”的縮寫,螢屏像素密度與螢屏尺寸和螢屏解析度有關,在單一變化條件下,螢屏尺寸越小、解析度越高,像素密度越大,反之越小,
在這里插入圖片描述

計算公式: 像素密度 = 像素 / 尺寸 (dpi = px / in)
標準螢屏像素密度(mdpi): 每英寸長度上還有160個像素點(160dpi),即稱為標準螢屏像素密度(mdpi),

密度無關像素(dp)
含義:density-independent pixel,叫dp或dip,與終端上的實際物理像素點無關
單位:dp,可以保證在不同螢屏像素密度的設備上顯示相同的效果,是安卓特有的長度單位,
場景例子:假如同樣都是畫一條長度是螢屏一半的線,如果使用px作為計量單位,那么在480x800解析度手機上設定應為240px;在320x480的手機上應設定為160px,二者設定就不同了;如果使用dp為單位,在這兩種解析度下,160dp都顯示為螢屏一半的長度,
dp與px的轉換:1dp = (dpi / 160 ) * 1px;

密度型別代表的解析度(px)螢屏像素密度(dpi)換算
低密度(ldpi)240 x 3201201dp = 0.75px
中密度(mdpi)320 x 4801601dp = 1px
高密度(hdpi)480 x 8002401dp = 1.5px
超高密度(xhdpi)720 x 12803201dp = 2px
超超高密度(xxhdpi)1080 x 19204801dp = 3px

獨立比例像素(sp)
scale-independent pixel,叫sp或sip,字體大小專用單位 ,Android開發時用此單位設定文字大小,可根據字體大小首選項進行縮放,
推薦使用12sp、14sp、18sp、22sp作為字體大小,不推薦使用奇數和小數,容易造成精度丟失,12sp以下字體太小,

sp與dp的區別
dp只跟螢屏的像素密度有關, sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”""或“超大”時,1sp>1dp=0.00625英寸,類似我們在windows里調整字體尺寸以后的效果——視窗大小不變,只有文字大小改變,


1. 適配原理

Android AutoSize的核心代碼來源于位元組跳動的微信文章https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA,網上也有多各個大神進行了代碼的封裝設計,都是萬變不離其中,

原理核心

        DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
        if (sNoncompatDensity == 0) {
            sNoncompatDensity = appDisplayMetrics.density;
            sNoncompatDensity = appDisplayMetrics.scaledDensity;
            application.registerComponentCallbacks(new ComponentCallbacks() {
                
                public void onConfigurationChanged(Configuration newConfig) {
                    if (newConfig != null && newConfig.fontScale > 0) {
                        sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                
                public void onLowMemory() {

                }
            });
        }
        float targetDensity = appDisplayMetrics.widthPixels / 360;
        float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
        int targetDensityDpi = (int) (160 * targetDensity);
        appDisplayMetrics.density = targetDensity;
        appDisplayMetrics.scaledDensity = targetScaleDensity;
        appDisplayMetrics.densityDpi = targetDensityDpi;

        final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density = targetDensity;
        activityDisplayMetrics.scaledDensity = targetScaleDensity;
        activityDisplayMetrics.densityDpi = targetDensityDpi;

原理很簡單,例如一個4.59的10801920的手機它的dpi=480,它的density=480/160,則說明1dp=3px,當我們在布局中給如TextView設定
layout_width=30dp時,在程式運行時會自動計算其對應px單位長度90px,px=dp
density,

今日頭條適配方案的核心就是動態計算程式中的density=appDisplayMetrics.widthPixels / 360,360是原始設計圖紙的dp,假設原先的設計圖紙10801920,現在適配5.99寸560dpi的14402880手機,則30dp=30560/160=105px,實際上螢屏適配要求的30dp=1440/36030=120px才可以達到適配效果,因為120/1440=90/1080,控制元件在布局中的占寬比是一樣的才能達到寬度適配效果,這就是為什么要動態修改全域或activity的DisplayMetrics#density的目的了,

優缺點

優點:

  1. 侵入性非常低,該方案和專案完全解耦,使用的還是Android官方單位
  2. 接入無性能損耗,使用的全是Android官方的API,

缺點:

  1. 專案中的系統控制元件、三方庫控制元件、等非我們專案自身設計的控制元件,它們的設計圖尺寸并不會和我們專案自身的設計圖尺寸一樣,此時會產生適配誤差,解決方案就是取消當前 Activity 的適配效果,改用其他的適配方案
  2. 系統修改字體大小后,回傳應用系統字體大小還是未改變,需要設定registerComponentCallbacks監聽, Android AutoSize框架已經解決了該問題,
  3. 在使用程序中需要進行registerComponentCallbacks監聽內容文字的大小改變情況,解決退出應用修改文字大小后,文字大小不改變的情況,

2. 框配置

依賴配置

  1. 遠程依賴,截止到2020.9.15,版本為1.2.1
    implementation 'me.jessyan:autosize:1.2.1'
  1. 從github上下載原始碼進行library庫依賴

引數配置
在AndroidManifest.xml中配置引數

<manifest>
    <application>    
        ...
        <meta-data
            android:name="design_width_in_dp"
            android:value="360"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="640"/>      
        ...
     </application>           
</manifest>

3. 自定義初始化

本文中使用的框架是經過大神JessYan的封裝后成為你所看到的框架,它能根據一套給定的設計圖尺寸進行布局展示,當安裝當不同解析度尺寸的設備上時,它能自動適配螢屏,

框架的初始化時機是配置在ContentProvider中,在Application#onCreate()方法之前啟動,框架一旦初始化完成,其適配效果會在Activity和Fragment、各種View中自動全域適配,程式將默認是以螢屏寬度為基準進行適配的,并且使用的是在AndroidManifest中填寫的全域設計圖尺寸進行全域適配,

框架支持dp、sp兩個主單位,pt、in、mm三個冷門副單位,如果使用副單位,可以規避系統控制元件或三方庫控制元件使用的不良影響,

ContentProvider初始化第三方庫
ContentProvider是一種共享型組件,它通過Binder向其他組件或者其他應用程式提供資料,當ContentProvider所在行程啟動時候,ContentProvider會被同時啟動并被發布到AMS中,

ContentProvider的onCreate要優先于Application的onCreate,但在attachBaseContext()之后而執行,它的具體詳細啟動原始碼在ActivityThread中,很多人會在ContentProvider#onCreate()初始化第三方庫,

一般進行了依賴配置引數配置兩操作,Android AutoSize就配置完成可以直接使用了,它的框架原始碼初始化在InitProvider代碼中,

在InitProvider 中已進行了初始化設定

public class InitProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        if (getContext() != null) {
            Context application = getContext().getApplicationContext();
            if (application == null) {
                application = AutoSizeUtils.getApplicationByReflect();
            }
            AutoSizeConfig.getInstance()
                    .setLog(true)
                    .init((Application) application)
                    .setUseDeviceSize(false);
            return true;
        }
        return false;
    }

但是為了個性化的配置,我們可以在Application中進行一些自定義設定,設定的方法都應寫在Application#onCreate()方法中,

public class Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ...
        AutoSize.initCompatMultiProcess(this);
        AutoSize.checkAndInit(this);
        AutoSizeConfig.getInstance()
                .setCustomFragment(true)
                .setExcludeFontScale(true)
                .setPrivateFontScale(0.8f)
                .setLog(false)
                .setBaseOnWidth(true)
                .setUseDeviceSize(true)
                //螢屏適配監聽器
                .setOnAdaptListener(new OnAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
//                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
//                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                        AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                    }
                });
        configUnits();
    }
    
    private void configUnits() {
        AutoSizeConfig.getInstance()
                .getUnitsManager()
                .setSupportDP(true)
                .setDesignSize(2160, 3840)
                .setSupportSP(true)
                .setSupportSubunits(Subunits.MM);
    }
}

4. 常用方法決議

對于初始化中方法,我們進行一一分析
1. AutoSize.initCompatMultiProcess(Context context)
當 App 中出現多行程,并且您需要適配所有的行程,就需要在 App 初始化時呼叫,一般的單行程App程式不用設定,

2. AutoSize.checkAndInit(Application application)

     if (!checkInit()) {
            AutoSizeConfig.getInstance()
                    .setLog(true)
                    .init(application)
                    .setUseDeviceSize(false);
        }

一般來說Android AutoSize會通過InitProvider實體化自動完成初始化,是不需要呼叫checkAndInit()方法的,

但由于某些 issues 反應, 可能會在某些特殊情況下出現InitProvider未能正常實體化的情況, 導致 AndroidAutoSize 未能完成初始化,所以需要使用該方法確保Android AutoSize 初始化成功,

3. AutoSizeConfig.getInstance().setCustomFragment(boolean customFragment)
設定是否讓框架支持自定義Fragment 的適配引數,一般這個需求比較少,默認不支持的

4. AutoSizeConfig.getInstance().setExcludeFontScale(true)
是否屏蔽系統字體大小對AndroidAutoSize 的影響, 如果為 true, App 內的字體的大小將不會跟隨系統設定中字體大小的改變, 如果為 false, 則會跟隨系統設定中字體大小的改變, 默認為 false

5. AutoSizeConfig.getInstance().setPrivateFontScale(float fontScale)
區別于系統字體大小的放大比例, AndroidAutoSize 允許 APP 內部可以獨立于系統字體大小之外,獨自擁有全域調節 APP 字體大小的能力, fontScale取值0~1,設為 0 則取消此功能,同時字體的單位必須是sp做單位,

6. AutoSizeConfig.getInstance().setLog(boolean log)
設定是否列印AutoSize的日志,true為列印

7. AutoSizeConfig.getInstance().setBaseOnWidth(true)
是否全域按照寬度進行等比例適配,true以寬來適配,false以高來適配

8. AutoSizeConfig.getInstance().stop(this)
自動適配方案可以手動呼叫方法停止,需要注意的是Android AutoSize暫停只是停止了對后續還沒有啟動的{@link Activity}進行適配的作業,但對已經啟動且已經適配的{@link Activity}不會有任何影響

9. AutoSizeConfig.getInstance().restart()
AutoSize可以暫停適配也可以重啟適配,但是重啟適配只能對后續還沒有啟動的 {@link Activity} 進行適配的作業,但對已經啟動且在stop期間未適配的{@link Activity}不會有任何影響

10. AutoSizeConfig.getInstance().setUseDeviceSize(true)
是否以螢屏的實際尺寸為高度,默認為false,螢屏的適配高度是螢屏總高度減去狀態欄高度,

11. UnitsManager.setSupportSP(boolean supportSP)
是否讓框架支持sp單位,默認是為true支持,如果為false,則字體大小最好設定為其他單位才能自動適配

12. UnitsManager.setSupportSubunits(Subunits supportSubunits)
自主設定心儀的副單位,可以從pt、in、mm中進行選擇,如果使用了Subunits#NONE即代表不支持副單位

13. UnitsManager.setSupportDP(boolean supportDP)
是否支持dp單位,默認是true支持,如果關閉將不對dp單位進行支持

14. UnitsManager.setDesignSize(float designWidth, float designHeight)
設定設計圖尺寸,一般專為副單位尺寸設計,它與AndroidManifest.xml中配置的引數不一樣,不會被覆寫,

5. 常見介面及類的使用

CustomAdapt

實作CustomAdapt介面即可對activity和fragment進行新的自定義尺寸適配,適配方向可以自主選擇是寬度還是高度,實作該介面會取消默認的適配方案和效果

對于fragment的自定義尺寸需要進行AutoSizeConfig.getInstance().setCustomFragment(true)設定,默認是不支持對fragment的自定義尺寸適配的,

在CustomAdapt介面中需要實作者重寫兩個方法boolean isBaseOnWidth()和float getSizeInDp(),根據使用者需求自定義,
1. boolean isBaseOnWidth()
為了保證在高寬比不同的螢屏上也能正常適配,所以只能在寬度和高度之中選一個作為基準進行適配, true為按照寬度適配, false 為按照高度適配

2. float getSizeInDp()
getSizeInDp 須配合isBaseOnWidth()使用, 有如下使用規則:
如果 {@link #isBaseOnWidth()} 回傳 {@code true}, {@link CustomAdapt #getSizeInDp} 則應該回傳設計圖的總寬度,
如果 {@link #isBaseOnWidth()} 回傳 {@code false}, {@link CustomAdapt #getSizeInDp} 則應該回傳設計圖的總高度,
如果您不需要自定義設計圖上的設計尺寸, 想繼續使用在 AndroidManifest 中填寫的設計圖尺寸,getSizeInDp 則回傳 0即可,

CancelAdapt

介面CancelAdapt沒有任何成員變數,支持AndroidAutoSize的專案所有模塊默認使用適配功能,第三方庫的也不例外,
如果某個頁面不想使用適配功能, 請讓該頁面實作CancelAdapt介面放棄適配,所有的適配效果都將失效,

6.框架核心

1.螢屏適配自定義

通過位元組跳動的核心原始碼,只能進行全域適配,但是該框架中進行了Activity和Fragmen的自定義適配和隨時取消恢復適配功能,它的原理是注冊了ActivityLifecycleCallbacks,進行了Activity的適配時間精準化自我掌控,

通過注冊ActivityLifecycleCallbacks,進行Activity的生命周期進行管理, 當onActivityCreated時,也就是OnCreate()的setContentView之前進行了AutoAdaptStrategy#applyAdapt的呼叫,這種方案類似于 AOP, 面向介面, 侵入性低, 方便統一管理, 擴展性強,

    @Override
    public void onActivityCreated(@androidx.annotation.NonNull Activity activity, Bundle savedInstanceState) {
        if (AutoSizeConfig.getInstance().isCustomFragment()) {
            if (mFragmentLifecycleCallbacksToAndroidx != null && activity instanceof androidx.fragment.app.FragmentActivity) {
                ((androidx.fragment.app.FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacksToAndroidx, true);
            }
        }
        //Activity 中的 setContentView(View) 一定要在 super.onCreate(Bundle); 之后執行
        if (mAutoAdaptStrategy != null) {
            mAutoAdaptStrategy.applyAdapt(activity, activity);
        }
    }

通過注冊registerFragmentLifecycleCallbacks,進行Fragment的生命周期管理,當onFragmentCreated時,也就是OnCreate()中進行了AutoAdaptStrategy#applyAdapt的呼叫
@Override
public void onFragmentCreated(@androidx.annotation.NonNull FragmentManager fm, @androidx.annotation.NonNull Fragment f, Bundle savedInstanceState) {
if (mAutoAdaptStrategy != null) {
mAutoAdaptStrategy.applyAdapt(f, f.getActivity());
}
}

通過全域的進行Activity和Fragment的生命周期監控,在其布局創建之前呼叫 AutoAdaptStrategy#applyAdapt進行具體的適配操作,它的關鍵點是動態修改density、scaledDensity、densityDpi三個引數,造成每個Activity或Fragment加載布局時的density、scaledDensity、densityDpi等引數不一樣,達到的適配效果則不一樣,

2.適配策略的實作

ActivityLifecycleCallbacks的使用能實時監測Activity和Fragment進行適配呼叫,但是實際操作的代碼在策略方案AutoAdaptStrategy的實作子類中,框架中已有默認策略方案,當然自己也可以自定義修改創建,

  • 當target實作CancelAdapt后,將density、scaledDensity、densityDpi恢復到原始狀態,不進行匹配
  • 當target實作CustomAdapt后,將density、scaledDensity、densityDpi根據target的配置進行計算后設定
  • 當target未進行任何處理時,將density、scaledDensity、densityDpi根據AndroidManifest.xml中的配置進行計算設定
    @Override
    public void applyAdapt(Object target, Activity activity) {
    	....
        //如果 target 實作 CancelAdapt 介面表示放棄適配, 所有的適配效果都將失效
        if (target instanceof CancelAdapt) {
            AutoSizeLog.w(String.format(Locale.ENGLISH, "%s canceled the adaptation!", target.getClass().getName()));
            AutoSize.cancelAdapt(activity);
            return;
        }

        //如果 target 實作 CustomAdapt 介面表示該 target 想自定義一些用于適配的引數, 從而改變最終的適配效果
        if (target instanceof CustomAdapt) {
            AutoSizeLog.d(String.format(Locale.ENGLISH, "%s implemented by %s!", target.getClass().getName(), CustomAdapt.class.getName()));
            AutoSize.autoConvertDensityOfCustomAdapt(activity, (CustomAdapt) target);
        } else {
            AutoSizeLog.d(String.format(Locale.ENGLISH, "%s used the global configuration.", target.getClass().getName()));
            AutoSize.autoConvertDensityOfGlobal(activity);
        }
        ...
    }
   

7. 其實事項

1. Fragment橫豎屏切換布局問題
由于某些原因, 螢屏旋轉后 Fragment 的重建, 會導致框架對 Fragment 的自定義適配引數失去效果,所以如果您的 Fragment 允許螢屏旋轉, 則請在 onCreateView 手動呼叫一次 AutoSize.autoConvertDensity(),如AutoSize.autoConvertDensity(getActivity(), 1080, true),
如果您的 Fragment 不允許螢屏旋轉, 則可以將下面呼叫 AutoSize.autoConvertDensity() 的代碼洗掉掉

public class CustomFragment1 extends Fragment implements CustomAdapt {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //由于某些原因, 螢屏旋轉后 Fragment 的重建, 會導致框架對 Fragment 的自定義適配引數失去效果
        //所以如果您的 Fragment 允許螢屏旋轉, 則請在 onCreateView 手動呼叫一次 AutoSize.autoConvertDensity()
        //如果您的 Fragment 不允許螢屏旋轉, 則可以將下面呼叫 AutoSize.autoConvertDensity() 的代碼洗掉掉
        AutoSize.autoConvertDensity(getActivity(), 1080, true);
        return createTextView(inflater, "Fragment-1\nView width = 360dp\nTotal width = 1080dp", 0xffff0000);
    }

2. 主副單位的逐步替換
框架中同時支持主單位和副單位,對于對于舊專案中已使用dp或px的專案,可以通過逐步在新頁面中使用主單位副單位,通過不斷的迭代替換,最終將專案中的主單位如dp全替換為副單位px,或者將副單位px全替換為主單位dp,

當單位都替換完成后,設定UnitsManager.setSupportDP(false)關閉對dp的支持,徹底隔離修改 density 所造成的不良影響,
或者都使用dp,不在支持副單位時設定UnitsManager.setSupportSubunits(Subunits.NONE)關閉對副單位的支持,

3. 主副單位的同時支持
當使用者想將舊專案從主單位過渡到副單位, 或從副單位過渡到主單位時,因為在使用主單位時, 建議在 AndroidManifest 中填寫設計圖的 dp 尺寸, 比如 360 * 640,

但在 AndroidManifest 中卻只能填寫一套設計圖尺寸, 并且已經填寫了主單位的設計圖尺寸,所以當專案中同時存在副單位和主單位, 并且副單位的設計圖尺寸與主單位的設計圖尺寸不同時, 可以通過UnitsManager#setDesignSize() 方法配置,

如果副單位的設計圖尺寸與主單位的設計圖尺寸相同, 則不需要呼叫 UnitsManager#setDesignSize(), 框架會自動使用 AndroidManifest 中填寫的設計圖尺寸,

4. 自定義單位模擬器創建
布局時的實時預覽在開發階段是一個很重要的環節, 很多情況下 Android Studio 提供的默認預覽設備并不能完全展示我們的設計圖,所以我們就需要自己創建模擬設備, 大神@JessYan已經為我們準備好了dp、pt、in、mm 這四種單位的模擬設備創建方法,請點擊查看鏈接https://github.com/JessYanCoding/AndroidAutoSize/blob/master/README-zh.md#preview

總結

經過我自己修改注釋的原始碼在https://github.com/l424533553/MyAutoSize.git中,大家也可以自行封裝框架,適合自己的才是最好的,
自適應的核心就是根據需要在使用之前不斷修改density、scaledDensity、densityDpi達到適配效果,


博客書寫不易,您的點贊收藏是我前進的動力,覺得不錯請點贊、 收藏 ^ _ ^ !
相關鏈接

  • Https通信之數字證書 https://blog.csdn.net/luo_boke/article/details/106018128
  • Kotlin到底比Java好在哪,我們不得不說的事 https://blog.csdn.net/luo_boke/article/details/107172965
  • Android 史上最新最全的ADB及命令百科,沒有之一https://blog.csdn.net/luo_boke/article/details/106303208

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/124653.html

標籤:其他

上一篇:flutter使用local_auth插件出現local_auth plugin requires activity to be a FragmentActivity.

下一篇:Android連接遠程MySQL資料庫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more