Android 使用百度LBS SDK(五)(1)

class MyOnClickListener implements View.OnClickListener {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.layoutBack:

minimumWindow();

break;

case R.id.btnStart:

if (hasOfflineMap) {

AlertDialog.Builder builder = new Builder(

OfflineBaiduMapUpdateActivity.this);

builder.setMessage(getResources().getString(

R.string.hint_import_is_cost_time));

builder.setTitle(getResources().getString(R.string.hint));

builder.setPositiveButton(

getResources().getString(R.string.confirm),

new OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.dismiss();

startImportThread();

}

});

builder.setNegativeButton(

getResources().getString(R.string.cancel),

new OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.dismiss();

}

});

builder.create().show();

} else {

// SD卡未扫描到离线地图

}

break;

case R.id.btnScan:

setMapNumberText();

break;

case R.id.layoutUpdateOnline:

Intent intentUpdate = new Intent(

OfflineBaiduMapUpdateActivity.this,

OfflineBaiduMapActivity.class);

startActivity(intentUpdate);

break;

default:

break;

}

}

}

/**

  • 获取SD卡离线地图数目

  • @return

*/

private int getSDMapCount() {

int fileCount1 = checkFileNumber(pathFrom[0]);

int fileCount2 = checkFileNumber(pathFrom[1]);

int fileCount3 = checkFileNumber(pathFrom[2]);

int fileCount4 = checkFileNumber(pathFrom[3]);

if (fileCount1 > 0)

return fileCount1;

else if (fileCount2 > 0)

return fileCount2;

else if (fileCount3 > 0)

return fileCount3;

else if (fileCount4 > 0)

return fileCount4;

else

return -1;

}

private int checkFileNumber(String path) {

try {

File a = new File(path);

String[] file = a.list();

progressCopy.setMax(file.length);

if (file.length > 0) {

return file.length;

} else

return -1;

} catch (Exception e) {

return -1;

}

}

/**

  • 复制整个文件夹内容

  • @param oldPath

  •        String 原文件路径
    
  • @param newPath

  •        String 复制后路径
    
  • @return boolean

*/

public boolean copyFolder(String oldPath, String newPath) {

boolean isok = true;

try {

(new File(newPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹

File a = new File(oldPath);

String[] file = a.list();

progressCopy.setMax(file.length);

if (file.length > 0) {

Message message = new Message();

message.what = 2;

copyHandler.sendMessage(message);

}

File temp = null;

for (int i = 0; i < file.length; i++) {

if (isActivityShow) {

if (oldPath.endsWith(File.separator)) {

temp = new File(oldPath + file[i]);

} else {

temp = new File(oldPath + File.separator + file[i]);

}

if (temp.isFile()) {

FileInputStream input = new FileInputStream(temp);

FileOutputStream output = new FileOutputStream(newPath

  • “/” + (temp.getName()).toString());

byte[] b = new byte[1024 * 5];

int len;

while ((len = input.read(b)) != -1) {

output.write(b, 0, len);

}

output.flush();

output.close();

input.close();

}

// if (temp.isDirectory()) {// 如果是子文件夹

// copyFolder(oldPath + “/” + file[i], newPath + “/” +

// file[i]);

// }

MyLog.v(“Copy:” + file[i] + " Success");

progressCopy.setProgress(i);

Message message = new Message();

message.what = 3;

message.arg1 = i + 1;

message.arg2 = progressCopy.getMax();

copyHandler.sendMessage(message);

} else {

// 跳出循环,不进行后台拷贝

break;

}

}

// 更新Media Database

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,

Uri.parse(“file://” + Constant.Path.BAIDU_OFFLINE_SUB)));

Message message = new Message();

message.what = 1;

copyHandler.sendMessage(message);

} catch (Exception e) {

Log.e(Constant.TAG,

“Copy Map form SD " + oldPath + " Error:” + e.toString());

isok = false;

Message message = new Message();

message.what = 0;

copyHandler.sendMessage(message);

}

return isok;

}

final Handler copyHandler = new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case 0:

Log.e(Constant.TAG, “There is no offline map!”);

textDetail.setVisibility(View.GONE);

textHint.setText(getResources().getString(

R.string.sd_has_no_map));

progressCopy.setVisibility(View.GONE);

btnStart.setVisibility(View.VISIBLE);

btnScan.setVisibility(View.VISIBLE);

// finish();

break;

case 1:

Log.e(Constant.TAG, “copy data success!”);

Intent i = new Intent();

setResult(RESULT_OK, i);

textHint.setText(getResources().getString(

R.string.import_sd_success));

textDetail.setVisibility(View.GONE);

progressCopy.setVisibility(View.GONE);

btnStart.setVisibility(View.VISIBLE);

btnScan.setVisibility(View.VISIBLE);

break;

case 2:

textHint.setText(getResources().getString(

R.string.importing_not_exist));

progressCopy.setVisibility(View.VISIBLE);

btnStart.setVisibility(View.GONE);

btnScan.setVisibility(View.GONE);

break;

case 3:

int now = msg.arg1;

int total = msg.arg2;

textDetail.setVisibility(View.VISIBLE);

textDetail.setText(now + “/” + total);

break;

case 4:

// textHint.setText(“正在检测SD卡是否有离线地图”);

break;

}

super.handleMessage(msg);

}

};

public class CopyThread implements Runnable {

@Override

public void run() {

for (int i = 0; i < pathFrom.length; i++) {

if (!copyFolder(pathFrom[i], Constant.Path.BAIDU_OFFLINE_SUB)) {

} else {

Message message = new Message();

message.what = 4;

copyHandler.sendMessage(message);

Log.v(Constant.TAG, “Copy Map form SD Success, From:”

  • pathFrom[i]);

break;

}

}

}

}

/**

  • 导入离线地图包数据

*/

private MKOfflineMap mOffline = null;

public void importOfflineMapFromSDCard() {

mOffline = new MKOfflineMap();

mOffline.init(new MyMKOfflineMapListener());

int num = mOffline.importOfflineData();

Log.v(Constant.TAG, “ImportDataThread:Import Baidu Offline Map number:”

  • num);

if (num == 0) {

// 没有导入离线包,可能是离线包放置位置不正确,或离线包已经导入过

} else {

// "成功导入 num 个离线包

}

// new Thread(new ImportDataThread()).start();

}

public class ImportDataThread implements Runnable {

@Override

public void run() {

}

}

class MyMKOfflineMapListener implements MKOfflineMapListener {

@Override

public void onGetOfflineMapState(int type, int state) {

switch (type) {

case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:

MKOLUpdateElement update = mOffline.getUpdateInfo(state);

// 处理下载进度更新提示

if (update != null) {

// stateView.setText(String.format(“%s : %d%%”,

// update.cityName,

// update.ratio));

// updateView();

}

break;

case MKOfflineMap.TYPE_NEW_OFFLINE:

// 有新离线地图安装

break;

case MKOfflineMap.TYPE_VER_UPDATE:

// 版本更新提示

// MKOLUpdateElement e = mOffline.getUpdateInfo(state);

break;

}

}

}

@Override

protected void onStop() {

isActivityShow = false;

super.onStop();

}

}

5.在线更新离线地图:

package com.tchip.baidunavi.ui.activity;

import java.util.ArrayList;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.AlertDialog.Builder;

import android.content.DialogInterface;

import android.content.Intent;

import android.graphics.Color;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.view.Window;

import android.view.WindowManager;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ArrayAdapter;

import android.widget.BaseAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.LinearLayout;

import android.widget.ListAdapter;

import android.widget.ListView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import android.widget.Toast;

import com.baidu.mapapi.map.offline.MKOLSearchRecord;

import com.baidu.mapapi.map.offline.MKOLUpdateElement;

import com.baidu.mapapi.map.offline.MKOfflineMap;

import com.baidu.mapapi.map.offline.MKOfflineMapListener;

import com.tchip.baidunavi.R;

import com.tchip.baidunavi.util.MyLog;

import com.tchip.baidunavi.util.NetworkUtil;

/**

  • 安装后搜索仍需联网,但会节约达90%的流量

  • 低分屏:L 高分屏:H (854x480 5’ 属于低分屏)

*/

public class OfflineBaiduMapActivity extends Activity implements

MKOfflineMapListener {

private MKOfflineMap mOffline = null;

private TextView cidView;

private TextView stateView;

private EditText cityNameView;

private Button btnSearch;

private RelativeLayout layoutBack, layoutDownload, layoutCity,

layoutImport;

private LinearLayout layoutSingleDownload;

private boolean isSingleDownShow = false;

/**

  • 已下载的离线地图信息列表

*/

private ArrayList localMapList = null;

private LocalMapAdapter lAdapter = null;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_offline_baidumap);

mOffline = new MKOfflineMap();

mOffline.init(this);

initialLayout();

}

private void initialLayout() {

btnSearch = (Button) findViewById(R.id.btnSearch);

btnSearch.setOnClickListener(new MyOnClickListener());

layoutBack = (RelativeLayout) findViewById(R.id.layoutBack);

layoutBack.setOnClickListener(new MyOnClickListener());

layoutDownload = (RelativeLayout) findViewById(R.id.layoutDownload);

layoutDownload.setOnClickListener(new MyOnClickListener());

layoutCity = (RelativeLayout) findViewById(R.id.layoutCity);

layoutCity.setOnClickListener(new MyOnClickListener());

layoutImport = (RelativeLayout) findViewById(R.id.layoutImport);

layoutImport.setOnClickListener(new MyOnClickListener());

layoutSingleDownload = (LinearLayout) findViewById(R.id.layoutSingleDownload);

layoutSingleDownload.setVisibility(View.GONE);

cidView = (TextView) findViewById(R.id.cityid);

cityNameView = (EditText) findViewById(R.id.textCity);

stateView = (TextView) findViewById(R.id.state);

// ListView hotCityList = (ListView) findViewById(R.id.hotcitylist);

// ArrayList hotCities = new ArrayList();

// // 获取热闹城市列表

ArrayList records1 = mOffline.getHotCityList();

// if (records1 != null) {

// for (MKOLSearchRecord r : records1) {

// hotCities.add(r.cityName + “(” + r.cityID + “)” + " --"

// + this.formatDataSize(r.size));

// }

// }

// ListAdapter hAdapter = (ListAdapter) new ArrayAdapter(this,

// android.R.layout.simple_list_item_1, hotCities);

// hotCityList.setAdapter(hAdapter);

ListView allCityList = (ListView) findViewById(R.id.allcitylist);

// 获取所有支持离线地图的城市

final ArrayList allCities = new ArrayList();

ArrayList records2 = mOffline.getOfflineCityList();

if (records1 != null) {

for (MKOLSearchRecord r : records2) {

allCities.add(r.cityName + “(” + r.cityID + “)” + " --"

  • this.formatDataSize(r.size));

}

}

ListAdapter aAdapter = (ListAdapter) new ArrayAdapter(this,

R.layout.offline_map_all_city_list_item, R.id.textAllCityList,

allCities);

allCityList.setAdapter(aAdapter);

allCityList.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

if (NetworkUtil.isNetworkConnected(getApplicationContext())) {

int startIndex = allCities.get(position).indexOf(“(”) + 1;

int endIndex = allCities.get(position).indexOf(“)”);

String clickId = allCities.get(position).substring(

startIndex, endIndex);

MyLog.v(“Offline Map id:” + clickId);

mOffline.start(Integer.parseInt(clickId));

Toast.makeText(

getApplicationContext(),

getResources().getString(R.string.start_download)

  • “:”

  • allCities.get(position).substring(0,

startIndex - 1), Toast.LENGTH_SHORT)

.show();

} else {

NetworkUtil.noNetworkHint(getApplicationContext());

}

}

});

LinearLayout cl = (LinearLayout) findViewById(R.id.citylist_layout);

LinearLayout lm = (LinearLayout) findViewById(R.id.localmap_layout);

lm.setVisibility(View.GONE);

cl.setVisibility(View.VISIBLE);

// 获取已下过的离线地图信息

localMapList = mOffline.getAllUpdateInfo();

if (localMapList == null) {

localMapList = new ArrayList();

}

ListView localMapListView = (ListView) findViewById(R.id.localmaplist);

lAdapter = new LocalMapAdapter();

localMapListView.setAdapter(lAdapter);

}

/**

  • 设置下载单个城市离线地图是否可见

  • @param isShow

*/

private void setSingleDownShow(boolean isShow) {

if (!isShow) {

layoutSingleDownload.setVisibility(View.GONE);

isSingleDownShow = false;

} else {

layoutSingleDownload.setVisibility(View.VISIBLE);

isSingleDownShow = true;

}

}

class MyOnClickListener implements View.OnClickListener {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btnSearch:

// 搜索离线城市

if (NetworkUtil.isNetworkConnected(getApplicationContext())) {

ArrayList records = mOffline

.searchCity(cityNameView.getText().toString());

if (records == null || records.size() != 1) {

Toast.makeText(

getApplicationContext(),

getResources()

.getString(R.string.no_match_city),

Toast.LENGTH_SHORT).show();

return;

}

setSingleDownShow(true);

cidView.setText(String.valueOf(records.get(0).cityID));

} else {

NetworkUtil.noNetworkHint(getApplicationContext());

}

break;

case R.id.layoutBack:

onBackKeyPressed();

break;

case R.id.layoutDownload:

// 下载管理列表

LinearLayout cl = (LinearLayout) findViewById(R.id.citylist_layout);

LinearLayout lm = (LinearLayout) findViewById(R.id.localmap_layout);

lm.setVisibility(View.VISIBLE);

cl.setVisibility(View.GONE);

break;

case R.id.layoutCity:

// 城市列表

LinearLayout cls = (LinearLayout) findViewById(R.id.citylist_layout);

LinearLayout lms = (LinearLayout) findViewById(R.id.localmap_layout);

lms.setVisibility(View.GONE);

cls.setVisibility(View.VISIBLE);

break;

case R.id.layoutImport:

importFromSDCard();

break;

default:

break;

}

}

}

/**

  • 开始下载

  • @param view

*/

public void start(View view) {

if (NetworkUtil.isNetworkConnected(getApplicationContext())) {

Toast.makeText(this,

getResources().getString(R.string.offline_download_start),

Toast.LENGTH_SHORT).show();

startDownloadCityId = Integer

.parseInt(cidView.getText().toString());

new Thread(new StartDownloadThread()).start();

} else {

NetworkUtil.noNetworkHint(getApplicationContext());

}

}

private int startDownloadCityId = 1; // 要下载的城市ID

/**

  • 下载地图线程

*/

private class StartDownloadThread implements Runnable {

@Override

public void run() {

// 启动下载指定城市ID的离线地图,离线地图下载服务仅当wifi连接正常时可用

mOffline.start(startDownloadCityId);

startDownloadCityId = 1; // 重置

Message messageStartDownload = new Message();

messageStartDownload.what = 1;

startDownloadHandler.sendMessage(messageStartDownload);

}

}

final Handler startDownloadHandler = new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case 1:

updateView();

break;

default:

break;

}

}

};

/**

  • 暂停下载

  • @param view

*/

public void stop(View view) {

int cityid = Integer.parseInt(cidView.getText().toString());

mOffline.pause(cityid);

Toast.makeText(this,

getResources().getString(R.string.offline_download_pause),

Toast.LENGTH_SHORT).show();

updateView();

}

/**

  • 删除离线地图

  • @param view

*/

public void deleteMapByCityId(int cityId) {

deleteMapId = cityId;

new Thread(new DeleteMapThread()).start();

Toast.makeText(this,

getResources().getString(R.string.offline_download_delete),

Toast.LENGTH_SHORT).show();

updateView();

}

private int deleteMapId = 1; // 要删除的地图ID

/**

  • 删除地图线程

*/

private class DeleteMapThread implements Runnable {

@Override

public void run() {

mOffline.remove(deleteMapId);

deleteMapId = 1;

}

}

/**

  • 从SD卡导入离线地图安装包

  • 存放位置:USB存储器/BaiduMapSDK/vmp/l/zhongshan_187.dat

*/

public void importFromSDCard() {

new Thread(new ImportOfflineMapThread()).start();

}

private class ImportOfflineMapThread implements Runnable {

@Override

public void run() {

int mapNum = mOffline.importOfflineData();

String msg = “”;

if (mapNum == 0) {

Message messageNoMap = new Message();

messageNoMap.what = 1;

importOfflineMapHandler.sendMessage(messageNoMap);

} else {

Message messageImport = new Message();

messageImport.what = 2;

importOfflineMapHandler.sendMessage(messageImport);

}

}

}

final Handler importOfflineMapHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

switch (msg.what) {

case 1: // 未导入离线地图包

AlertDialog.Builder builder = new Builder(

OfflineBaiduMapActivity.this);

builder.setMessage(getResources().getString(

R.string.not_import_offline_map));

builder.setTitle(getResources().getString(R.string.hint));

builder.setPositiveButton(

getResources().getString(R.string.confirm),

new android.content.DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.dismiss();

}

});

builder.create().show();

break;

case 2:

AlertDialog.Builder builderImport = new Builder(

OfflineBaiduMapActivity.this);

builderImport.setMessage(getResources().getString(

R.string.import_success_without_num));

builderImport.setTitle(getResources().getString(R.string.hint));

builderImport.setPositiveButton(

getResources().getString(R.string.confirm),

new android.content.DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.dismiss();

}

});

builderImport.create().show();

updateView();

break;

default:

break;

}

}

};

/**

  • 更新状态显示

*/

public void updateView() {

new Thread(new UpdateViewThread()).start();

}

private class UpdateViewThread implements Runnable {

@Override

public void run() {

localMapList = mOffline.getAllUpdateInfo();

if (localMapList == null) {

localMapList = new ArrayList();

}

Message messageUpdate = new Message();

messageUpdate.what = 1;

updateViewHandler.sendMessage(messageUpdate);

}

}

final Handler updateViewHandler = new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case 1:

lAdapter.notifyDataSetChanged();

break;

default:

break;

}

}

};

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

onBackKeyPressed();

return true;

} else

return super.onKeyDown(keyCode, event);

}

private void onBackKeyPressed() {

if (isSingleDownShow) {

setSingleDownShow(false);

} else {

finish();

}

}

@Override

protected void onPause() {

int cityid = Integer.parseInt(cidView.getText().toString());

MKOLUpdateElement temp = mOffline.getUpdateInfo(cityid);

if (temp != null && temp.status == MKOLUpdateElement.DOWNLOADING) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

h();

}

}

@Override

protected void onPause() {

int cityid = Integer.parseInt(cidView.getText().toString());

MKOLUpdateElement temp = mOffline.getUpdateInfo(cityid);

if (temp != null && temp.status == MKOLUpdateElement.DOWNLOADING) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-FK3ZThRT-1713733739875)]

[外链图片转存中…(img-Xy0bvRYp-1713733739877)]

[外链图片转存中…(img-mOdjBCZ9-1713733739877)]

[外链图片转存中…(img-caknWbC1-1713733739879)]

[外链图片转存中…(img-BwBYCRXU-1713733739880)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

[外链图片转存中…(img-kTEZJRol-1713733739881)]

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

[外链图片转存中…(img-azbC12Uq-1713733739882)]

[外链图片转存中…(img-Pn4ob0UM-1713733739883)]

[外链图片转存中…(img-a3p1RzVg-1713733739885)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值