2018安卓面試經歷
原文連結:https://blog.csdn.net/lzq520210/article/details/79481086
首先宣告一下,以下部分答案是我自己答得,有不對的地方,大家可以在評論區改正,共同成長。
多點面試題
1、解決大圖片載入卡頓問題 先使用預設圖佔位,載入小圖 然後再載入大圖
2、長圖壓縮
3、經緯度 實時定位 耗電 為什麼不在某一時刻 去請求位置 經緯度是真的嗎 百度和高德怎麼轉換
4、版本更新為什麼使用服務 沒有直接下載 當時使用服務 是在服務中開啟的子執行緒下載,然後將為了將進度傳送的通知欄中
5、解決android7.0不能正常更新問題 api是24
1.宣告provider
2.FileProvider Uri apkUri =FileProvider.getUriForFile(context, "cn.doolii.usershopping.fileprovider", updateFile);
3.放到intent中 startActivity
6、強制更新怎麼實現的
7、自定義view實現打標籤怎麼做的 自定義view繼承Relativelayout 自定義一個view繼承button 有幾個屬性 方向 標籤內容 id等 重寫onTouch事件 觸控位置獲取到xy軸 addview
8、使用ImageLoader載入並快取圖片以及圓頭像展示 載入獲取bitmap canvas.drawRoundRect 畫圓角矩形
9、解決ScrollView與Viewpager和ListView衝突問題 動態計算listview的高度 然互設定 首先從listviewgetAdapter 遍歷adapter中的view 測量高度 累加 然後設定給listview Viewpager 也是動態設定
10、首次開啟App實現展示動態廣告頁面 我們的做法 直接載入圖片 大小200k以內 先顯示預設圖片 載入成功在替換 另一個方案 可以下載到本地 下次開啟再展示 或者
11、用百度定位實現地推人員的定位及簽到。 到時間點 點選簽到按鈕 然後進行簽到 傳經緯度
美圖面試
1、支付
2、同步鎖 自旋鎖
3、ANR什麼場景遇到
4、效能優化做過哪方面
5、記憶體洩露
6、安裝包瘦身
7、二分法
8、handler機制
9、執行緒池怎麼使用
10、極光推送
出門問問面試
1、下拉載入 自己實現 怎麼實現
2、單例模式 加同步鎖 怎麼加 鎖是什麼
3、開啟ac的時候動畫怎麼搞的 context.startActivity(intent);
((Activity) context).overridePendingTransition(R.anim.push_right_in,R.anim.pull_left_out);
4、動畫幾種模式
幀動畫 1首先在res/drawable資料夾下新增圖片 2新建frame_anim.xml <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true" >
<item
android:drawable="@drawable/img00"
android:duration="50"/>
3 imageView.setBackgroundResource(R.drawable.frame_anim);
animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();
補間動畫 1anim下建立xml
<?xml version="1.0" encoding= "utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees= "0"
android:toDegrees= "360"
android:duration= "1000">
</rotate>
2Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);
ivGirl.startAnimation(animation);
屬性動畫
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 0f);
//沿x軸放大
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 2f, 1f);
//沿y軸放大
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 2f, 1f);
//移動
ObjectAnimator translationXAnimator = ObjectAnimator.ofFloat(imageView, "translationX", 0f, 200f, 0f);
//透明動畫
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
AnimatorSet set = new AnimatorSet();
//同時沿X,Y軸放大,且改變透明度,然後移動
set.play(scaleXAnimator).with(scaleYAnimator).with(animator).before(translationXAnimator);
//都設定3s,也可以為每個單獨設定
set.setDuration(3000);
set.start();
5、android與js互動
1mWebView.getSettings().setJavaScriptEnabled(true);
2mWebView.addJavascriptInterface(new JSInterface(), "hgj");
3//js介面類
private class JSInterface {
@JavascriptInterface
public void acceptUrl(String imgUrl) {//此方法是將android端獲取的url返給js
}
@JavascriptInterface
public void fnUrl(String s) {
//js可以呼叫此方法 將s值傳給android端,然後android端進行相應的操作,此引數可以是任意型別的
}
@JavascriptInterface
public void fnId(String received){
//android 呼叫js js會回傳引數
Log.i("received--","---"+received);
}
}
4 mWebView.loadUrl("javascript:acceptUrl('" + url + "')");
5 js給android傳資料 wv.loadUrl("javascript:fnId()");
6、activity的啟動模式 a開啟a 棧裡是什麼樣的 standard singleTask singleTop singleInstance 單任務模式 使用場景 第一個a onResume onPause onStop 第二個a生命週期從頭開始
如果是signleTop a的生命週期
singleInstance 使用場景:電話撥打介面,Calendar或是DeskClock的鬧鐘, 收發郵件的Activity, NFC 等
7、單例優缺點
既能夠在需要時才初始化單例,又能保證執行緒安全,且單例物件初始化後呼叫getInstance不進行同步鎖
public class Singleton{
private static Singleton sInstance = null;
private Singleton(){
}
public void doSomething(){
//這是你的業務程式碼
}
public static Singleton getInstance(){
if(sInstance == null){
synchronized (Singleton.class){
if(sInstance == null){
sInstance = new Singleton();
}
}
}
return sInstance;
}
缺點:(1)單例模式一般沒有介面,擴充套件很困難,若要擴充套件,除了修改程式碼基本上沒有第二種途徑可以實現。
(2)單例物件如果持有Context,那麼很容易引發記憶體洩露,此時需要注意傳給單例物件的Context最好是Application Context。
9、斐波那契數列
//使用遞迴方法實現斐波那契數列
public static int feibonaci1(int n){
if(n==0){return 0;}
if(n==1){return 1;}
return feibonaci1(n-1)+feibonaci1(n-2);
}
10、遞迴為什麼慢
遞迴效率低是函式呼叫的開銷導致的。函式呼叫之前需要做許多工作,比如準備函式內區域性變數使用的空間、搞定函式的引數等 把某些遞迴寫成尾遞迴
11、SharedPreferences 的commit和apply的區別
public void SaveData() {
//指定操作的檔名稱
SharedPreferences share = context.getSharedPreferences(SILENAME, MODE_PRIVATE);
SharedPreferences.Editor edit = share.edit(); //編輯檔案
edit.putInt("age", 22); //根據鍵值對新增資料
edit.putString("name", "LJie");
edit.commit(); //儲存資料資訊
}
public void LoadData() {
//指定操作的檔名稱
SharedPreferences share = getSharedPreferences(SILENAME, MODE_PRIVATE);
tv1.setText("作者:"+share.getString("name", "資訊為空..."));
tv2.setText("年齡:"+share.getInt("age", 0));
}
commit是原子提交到資料庫,所以從提交資料到存在Disk中都是同步過程,中間不可打斷。
apply方法的原子操作是原子提交的記憶體中,而非資料庫,所以在提交到記憶體中時不可打斷,之後再非同步提交資料到資料庫中,因此也不會有相應的返回值。
所有commit提交是同步過程,效率會比apply非同步提交的速度慢,但是apply沒有返回值,永遠無法知道儲存是否失敗。
在不關心提交結果是否成功的情況下,優先考慮apply方法。
12、弱引用 軟引用 區別
弱引用 WeakReference 隨時可能會被垃圾回收器回收,不一定要等到虛擬機器記憶體不足時才強制回收。要獲取物件時,同樣可以呼叫get方法
軟引用 SoftReference 當虛擬機器記憶體不足時,將會回收它指向的物件;需要獲取物件時,可以呼叫get方法
WeakReference一般用來防止記憶體洩漏,要保證記憶體被虛擬機器回收,SoftReference多用作來實現快取機制(cache);
13、LRU三級快取 記憶體 硬碟 網路
14、大圖片處理 10000*1000
會oom 其實是給options的options.inJustDecodeBounds = true; // 設定為true,不將圖片解碼到記憶體中
圖片長寬壓縮:
BitmapFactory的decodeByteArray()、decodeFile()、decodeResource()
這些方法中都會傳入一個BitmapFactory.Options例項化物件,通過這個物件,可以更改一些載入圖片的設定
如果將options.inJustDecodeBounds設定為true,在解碼過程中就不會申請記憶體去建立Bitmap,返回的是一個空的Bitmap,但是可以獲取圖片的一些屬性,例如圖片寬高,圖片型別等等。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 設定為true,不將圖片解碼到記憶體中
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
// 圖片高度
int imageWidth = options.outWidth;
// 圖片寬度
String imageType = options.outMimeType;
為了避免OOM的異常,在載入圖片到記憶體之前,會先檢查圖片的尺寸
質量壓縮
public static void compressImageToFile(Bitmap bmp,File file) {
// 0-100 100為不壓縮
int options = 100;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的資料存放到baos中
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
尺寸壓縮
public static void compressBitmapToFile(Bitmap bmp, File file){
// 尺寸壓縮倍數,值越大,圖片尺寸越小
int ratio = 2;
// 壓縮Bitmap到對應尺寸
Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
canvas.drawBitmap(bmp, null, rect, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的資料存放到baos中
result.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
設定圖片的取樣率,降低圖片畫素
public static void compressBitmap(String filePath, File file){
// 數值越高,圖片畫素越低
int inSampleSize = 2;
BitmapFactory.Options options = new BitmapFactory.Options();
//取樣率
options.inSampleSize = inSampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的資料存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
15、高德地圖和百度地圖經緯度轉換
地球座標 (WGS84)
國際標準,從專業GPS 裝置中取出的資料的座標系
國際地圖提供商使用的座標系
火星座標 (GCJ-02)也叫國測局座標系
中國標準,從國行移動裝置中定位獲取的座標資料使用這個座標系
國家規定: 國內出版的各種地圖系統(包括電子形式),必須至少採用GCJ-02對地理位置進行首次加密。
百度座標 (BD-09)
百度標準,百度 SDK,百度地圖,Geocoding 使用
(本來就亂了,百度又在火星座標上來個二次加密)
火星座標系:
iOS 地圖(其實是高德)
Gogole地圖
搜搜、阿里雲、高德地圖
百度座標系:
當然只有百度地圖
WGS84座標系:
國際標準,谷歌國外地圖、osm地圖等國外的地圖一般都是這個
/**
* 火星座標系 (GCJ-02) 與百度座標系 (BD-09) 的轉換演算法 將 GCJ-02 座標轉換成 BD-09 座標
*
* @param lat
* @param lon
*/
public static double[] gcj02_To_Bd09(double lat, double lon) {
double x = lon, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
double tempLon = z * Math.cos(theta) + 0.0065;
double tempLat = z * Math.sin(theta) + 0.006;
double[] gps = {tempLat,tempLon};
return gps;
}
某大型網際網路面試 面試了三輪 都是安卓技術面 兩個半小時
一面
1、ac的啟動模式 standard singleTop singleTask singleInstance(鬧鐘 打電話)
2、handler原理 主執行緒子執行緒looper問題
一個執行緒只有一個messageQueue? 兩個handler可以共用一個messageQueue? 一個Thread 只有一個looper 多個handler
多個handler可以共用一個messagequeue 怎麼區分
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
enqueueMessage()方法裡面有一個msg.target = this;這句話就是重點,就是說我們通過sendMesasge(msg)一層一層的傳遞訊息,最後這個msg.target=this就是把當前的這個handler標記給這個當前我們傳送的msg,然後再把這個打好標記的資訊新增到訊息佇列中。
3、HandlerThread怎麼回事
new HandlerThread的Looper和ActivityThread的Looper不是同一個。HandlerThread自帶一個looper物件, HandlerThread.getLooper()方法即可獲得該HandlerThread的looper物件
4、IntentService 原理自動開子執行緒 執行耗時操作
5、自定義控制元件 自定義屬性先在res\values目錄下建立attrs.xml,定義自己的屬性:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyTextView">
<!--宣告MyTextView需要使用系統定義過的text屬性,注意前面需要加上android命名-->
<attr name="android:text" />
<attr name="mTextColor" format="color" />
<attr name="mTextSize" format="dimension" />
</declare-styleable>
</resources>
在佈局檔案中,使用屬性(注意引入我們應用程式的名稱空間,這樣在能找到我們包中的attrs):
<com.example.openxu.myview.MyTextView
android:layout_width="200dip"
android:layout_height="100dip"
openxu:mTextSize="25sp"
android:text="我是文字"
openxu:mTextColor ="#0000ff"
android:background="#ff0000"/>
在構造方法中獲取屬性值:
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
String text = ta.getString(R.styleable.MyTextView_android_text);
int mTextColor = ta.getColor(R.styleable.MyTextView_mTextColor, Color.BLACK);
int mTextSize = ta.getDimensionPixelSize(R.styleable.MyTextView_mTextSize, 100);
ta.recycle(); //注意回收
Log.v("openxu", “text屬性值:"+mText);
Log.v("openxu", "mTextColor屬性值:"+mTextColor);
Log.v("openxu", "mTextSize屬性值:"+mTextSize);
}
6、recyclerView怎麼使用 怎麼加header 我們使用itemtype
7、ui過渡渲染 什麼情況導致 怎麼處理 開發者選項 開啟過渡渲染按鈕
8、效能優化
apk瘦身 analyze --run inspection by name --輸入unused resource 第三方sdk
啟動優化
記憶體優化 記憶體洩露 leakcanary 怎麼確定程式碼有洩露 monitor MAT 怎麼使用 怎麼查詢哪裡洩露了
ui優化
耗電優化 什麼時候耗電
http請求(GZIP壓縮)
json資料解析(json解析效率主要是解析耗時),大量的資料解析
3.資料庫讀寫操作
4.SD卡讀寫操作
5.程式的執行的timer定時器(例如IM中的心跳包,用系統的Alarm優化)
6.網路切換(wifi會比手機的資料行動網路更加省電)
9、百度地圖和高德地圖怎麼轉換經緯度
10、java執行緒鎖 有哪些 syncronize 修飾靜態方法和非靜態方法的區別 靜態鎖是類。class 非靜態鎖是物件 如果讓一個靜態方法和非靜態方法產生互斥 用同一個鎖 可以做到
11、git 使用流程 git pull git add . git commit -m"" git push git branch git checkout git reset --hard^
12、pull和pull --rebase
—rebase 並不會產生一個commit提交,而是會將你的E commit附加到D commit的結尾處。在看commit log時,不會多出你所不知道的commit出來。其實此處的F commmit是無意義的,它只是一個merge commit。而且這裡面的message裡面的branch日後也不存了,這些分支都會被清除掉。
13、分渠道打包
14、MultiDex 一個dex檔案不能超過65536方法
使用方法 三步
buildgradle中配置multiDexEnabled true
defaultConfig {
multiDexEnabled true
}
dependencies新增依賴 compile 'com.android.support:multidex:1.0.0'
自定義app繼承MultiDexApplication
15、動畫分幾種
幀動畫
res dawable中 加入xml檔案 《animation-list <item drawable=""
img.set
補間動畫
屬性動畫
16、android與js互動
@Javascript 有什麼漏洞
JavaScript一種解釋型語言,其執行原理是邊解釋邊執行,JavaScript與一些伺服器指令碼語言(如ASP、PHP)以及編譯型語言(如C、C++)不同,其原始碼可以輕鬆被任何人獲取到
解決:不把此類敏感資訊直接儲存進頁面內的js和ajax請求響應內容中就可以解決這類問題
17、個人優勢 (會吹牛逼 算嗎 哈哈)
18、專案埋點
19、大圖片卡頓怎麼處理
20、scrollview和listview衝突怎麼解決 重寫listview 或者動態就算listview每一個item的高度,然後設定listview的總高度
二面
21、webview返回相關
canGoback 有問題嗎 怎麼解決的
因重定向無法正常goBack()
22、app廣告頁是怎麼實現的 有幾種方案
23、分渠道打包 gradle配置渠道包 360加固
24、java sleep wait區別
25、圖片載入框架 imageloader glide Picasso 區別
imageloader 比較老的框架, 穩定, 載入速度適中, 缺點在於不支援GIF圖片載入, 使用稍微繁瑣, 並且快取機制沒有和http的緩
存很好的結合, 完全是自己的一套快取機制(完整大小).
Picasso 使用方便, 一行程式碼完成載入圖片並顯示, 框架體積小,
缺點在於不支援 GIF, 並且它可能是想讓伺服器去處理圖片的縮放, 它快取的圖片是未縮放的, 並且預設使用
ARGB_8888 格式快取圖片, 快取體積大.
glide可以說是 Picasso 的升級版, 有 Picasso 的優點, 並且支援 GIF 圖片載入顯示, 圖片快取也會自動縮放, 預設使用
RGB_565 格式快取圖片, 是 Picasso 快取體積的一半.
26、推送 個推 極光 如何根據個人資訊推訊息 別名 推送訊息 後臺可以直接傳送推送嗎 推送到達率多少?能保證多大的到達率?
27、json解析是怎麼回事,怎麼就把json字串轉成物件了
28、哪些物件需要序列化 用intent傳值 物件做儲存
29、哪些物件需求混淆 哪些物件不能被混淆
#---------------------------------預設保留區---------------------------------
-
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View
-keep public class * extends android.preference.Preference
-keep class android.support.** {*;}
30、覺得自己在專案中哪塊擅長
31、RelativeLayout 中間放一個Button 怎麼做 在Button 加入centerInParent=“true” RelativeLayout的居中是不起作用的,在父佈局RelativeLayout中加入gravity屬性是不可行的
32、hashmap底層怎麼實現 為什麼為什麼設計 key-value結構 雜湊表 怎麼實現的 雜湊衝突怎麼解決
三面
33、外掛化
34、安卓從哪個版本開始使用的art模式
35、art dalvik 區別
Dalvik Android 4.4 及其以下平臺使用的虛擬機器;
ART Android4.4以上平臺使用的虛擬機器技術;
android5.0正式使用art虛擬機器
36、對kotlin的理解
37、檢視我的csdn部落格
38、你對加班什麼態度
39、如何安撫手下
40、怎麼學習
41、怎麼看我們公司
領主科技面試
1、23 是安卓6.0 24是安卓7.0
2、如何區分只主專案 還是依賴的第三方 apply plugin: 'com.android.application' apply plugin: 'com.android.library'
3、橫屏豎屏
android:configChanges 不寫 重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次
android:configChanges="orientation|keyboardHidden" 只會執行onConfigurationChanged方法
4、安卓5.0與6.0區別
動態許可權
ContextCompat.checkSelfPermission(context,Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED
ActivityCompat.requestPermissions(context,permissions,requestCode);
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults[i]== PackageManager.PERMISSION_GRANTED)
}
安卓7.0
Uri imageUri = Uri.fromFile(file);
報錯FileUriExposedException
使用FileProvider
第一步:在manifest清單檔案中註冊provider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.jph.takephoto.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
exported:要求必須為false,為true則會報安全異常。
第二步:指定共享的目錄
第三步:使用FileProvider
Uri imageUri = FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider", file);//通過FileProvider建立一個content型別的Uri
5、退出app的方式
方式一 android.os.Process.killProcess(android.os.Process.myPid()) //獲取PID
System.exit(0); //常規java、c#的標準退出法,返回值為0代表正常退出
方式二 ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
方式三 把所有ac 新增到集合中 迴圈finish退出 System.exit(0);
方式四 廣播 註冊廣播 傳送廣播 統一finish掉
6、服務啟動
startService() stopService()或stopSelf() oncreate onStartCommand onDestroy
bindService() unBindService() onCreate onBind onunbind ondestroy
7、Activity與Service的資料交流
a到s start intent傳
s到a 1廣播 2當Activity和Service繫結時,可以通過Binder來連結Service和Activity,通過Binder來返回繫結的Service來獲取Service物件內部的資料。
8、AIDL
9、ContentProvider
10、NDK
下載ndk開發工具包
配置環境變數
local.properties中配置NDK路徑 ndk.dir=C\:\\ndk\\android-ndk-r13b
在gradle.properties中配置
android.useDeprecatedNdk=true
1.寫native程式碼用於呼叫c程式碼
public class JNI {
static {
System.loadLibrary("Hello");
}
/*
* 定義native方法
* 呼叫c程式碼對應的方法
* */
public native String sayHello();
}
2.編譯動態連結庫
在build.gradle中
defaultConfig {
applicationId "www.basketi.cn.basketball.ccalljavademo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
ndk{
moduleName ("Hello");
abiFilters "armeabi", "armeabi-v7a", "x86"
}
ndk{
ldLibs "log"
}
}
3.載入動態連結庫
static {
//載入動態連結庫
System.loadLibrary("Hello");
}
4.寫對應的c程式碼
java中native去呼叫c程式碼
給含有native方法的類生成標頭檔案,如JNI類,然後根據標頭檔案中的方法,寫對應的c程式碼
11、http和https區別
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
未完待續,僅以我最近的經歷,分享給大家,希望可以幫助到你們!
---------------------
Android高階進階必備篇

Android高階進階必備篇
Android APP全方位效能調優

Android APP全方位效能調優
微信小程式與Hybrid混合開發

微信小程式與Hybrid混合開發
需要免費學習資料的可以關注我的主頁或者
我的CSDN:https://blog.csdn.net/weixin_44109213/article/details/85105880