Android开发除了flutter还有什么是必须掌握的吗?
相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了
除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
/**
-
获取MCC、MNC
-
@param pContext
-
@param pMCCAndMNC new GetMCCAndMNC(){};
*/
public static void getMCCAndMNC(Context pContext,GetMCCAndMNC pMCCAndMNC) {
mGetMCCAndMNC = pMCCAndMNC;
String _networkOperator = ((TelephonyManager) pContext.getSystemService(Context.TELEPHONY_SERVICE)).getNetworkOperator();
if (TextUtils.isEmpty(_networkOperator)) {
mGetMCCAndMNC.onFailure();
}else {
if (_networkOperator.length() < 5) {
mGetMCCAndMNC.onFailure();
}else {
String _MCC =_networkOperator.substring(0, 3);
String _MNC = _networkOperator.substring(3);
if (!TextUtils.isEmpty(_MCC) && !TextUtils.isEmpty(_MNC)) {
mGetMCCAndMNC.onSuccess(_MCC, _MNC);
}else{
mGetMCCAndMNC.onFailure();
}
}
}
}
/**
-
手机品牌
-
@return
*/
public static String getBrand() {
return android.os.Build.BRAND;
}
/**
-
手机型号
-
@return
*/
public static String getMobileModel() {
return android.os.Build.MODEL;
}
/**
-
手机号码
-
@return
*/
public static String getMobileNumber() {
return ((TelephonyManager) NewsApplication.sAppContext.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number();
}
/**
-
SDK版本
-
@return
*/
public static int getSDKVersionNumber() {
return Build.VERSION.SDK_INT;
}
/**
-
系统版本号
-
@return
*/
public static String getFrimWareVersionNumber() {
return Build.VERSION.RELEASE;
}
/**
-
获取手机CPU核心数
-
@return
*/
public static int getNumCores()
{
// Private Class to display only CPU devices in the directory listing
class CpuFilter implements FileFilter
{
@Override
public boolean accept(File pathname)
{
// Check if filename is “cpu”, followed by a single digit number
if (Pattern.matches(“cpu[0-9]”, pathname.getName()))
{
return true;
}
return false;
}
}
try
{
// Get directory containing CPU info
File dir = new File(“/sys/devices/system/cpu/”);
// Filter to only list the devices we care about
File[] files = dir.listFiles(new CpuFilter());
// Return the number of cores (virtual CPU devices)
return files.length;
}
catch (Exception e)
{
e.printStackTrace();
// Default to return 1 core
return 1;
}
}
/**
-
获得SDCard总大小
-
@return size (long)
*/
@SuppressWarnings(“deprecation”)
public static long getSDTotalSize() {
if (DeviceInfoUtils.hasSdcard()) {
File _FileExternalStorage = Environment.getExternalStorageDirectory();
StatFs _StatFs = new StatFs(_FileExternalStorage.getPath());
long _BlockSize, _TotalBlocks;
_BlockSize = _StatFs.getBlockSize();
_TotalBlocks = _StatFs.getBlockCount();
return _BlockSize * _TotalBlocks;
}else {
return 0;
}
}
/**
-
获得SDCard剩余容量(可用大小 )
-
@return size (long)
*/
@SuppressWarnings(“deprecation”)
public static long getSDAvailableSize() {
if (DeviceInfoUtils.hasSdcard()) {
File _FileExternalStorage = Environment.getExternalStorageDirectory();
StatFs _StatFs = new StatFs(_FileExternalStorage.getPath());
long _BlockSize, _AvailableBlocks;
_BlockSize = _StatFs.getBlockSize();
_AvailableBlocks = _StatFs.getAvailableBlocks();
return _BlockSize * _AvailableBlocks;
}else {
return 0;
}
}
/**
-
获得机身内存总大小
-
@return size (long)
*/
@SuppressWarnings(“deprecation”)
public long getRomTotalSize() {
File _FileDataDirectory = Environment.getDataDirectory();
StatFs _StatFs = new StatFs(_FileDataDirectory.getPath());
long _BlockSize, _TotalBlocks;
_BlockSize = _StatFs.getBlockSize();
_TotalBlocks = _StatFs.getBlockCount();
return _BlockSize * _TotalBlocks;
}
/**
-
获得机身可用内存
-
@return size (long)
*/
@SuppressWarnings(“deprecation”)
public static long getRomAvailableSize() {
File _FileDataDirectory = Environment.getDataDirectory();
StatFs _StatFs = new StatFs(_FileDataDirectory.getPath());
long _BlockSize, _AvailableBlocks;
_BlockSize = _StatFs.getBlockSize();
_AvailableBlocks = _StatFs.getAvailableBlocks();
return _BlockSize * _AvailableBlocks;
}
/**
-
获取手机MAC地址
-
@param pContext
-
@return
*/
public static String getMacAddress(Context pContext){
String result = “”;
WifiManager wifiManager = (WifiManager) pContext.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
result = wifiInfo.getMacAddress();
return result;
}
/**
-
Wifi状态
-
@param pContext
-
@return
*/
public static int getWifiStatus(Context pContext) {
return ((WifiManager) pContext.getSystemService(“wifi”)).getWifiState();
}
/**
-
Wifi 名称
-
@param pContext
-
@return
*/
public static String getWifiName(Context pContext) {
String str = “”;
WifiManager wifiManager = (WifiManager) pContext.getSystemService(Context.WIFI_SERVICE);
str = wifiManager.getConnectionInfo().getSSID();
return str;
}
/**
-
Wifi IP
-
@param pContext
-
@return
*/
public static String getHostIp(Context pContext) {
String str = “”;
try {
WifiManager wifiManager = (WifiManager) pContext.getSystemService(Context.WIFI_SERVICE);
int i;
if (wifiManager.isWifiEnabled()) {
i = wifiManager.getConnectionInfo().getIpAddress();
if (i != 0)
str = (i & 0xFF) + “.” + (0xFF & i >> 8) + “.”
- (0xFF & i >> 16) + “.” + (0xFF & i >> 24);
} else {
i = getWifiStatus(pContext);
if ((i == 2) || (i == 3)) {
Enumeration<?> enumeration = NetworkInterface.getNetworkInterfaces();
while (enumeration.hasMoreElements()) {
Enumeration<?> enumerationTemp = ((NetworkInterface) enumeration
.nextElement()).getInetAddresses();
if (!enumerationTemp.hasMoreElements())
;
while (true) {
if (str.length() <= 0)
break;
InetAddress localInetAddress = (InetAddress) enumerationTemp
.nextElement();
if ((localInetAddress.isLoopbackAddress())
|| (!(localInetAddress instanceof Inet4Address)))
break;
str = localInetAddress.getHostAddress();
}
}
}
}
} catch (Exception localException) {
localException.printStackTrace();
}
return str;
}
/**
-
外部存储是否挂载
-
@return true or false
*/
public static boolean isSDCardMounted() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
/**
-
外部存储是否存在
-
@return true or false
总结
Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
F(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞
[外链图片转存中…(img-pFq6tNlH-1715675988621)]
[外链图片转存中…(img-IITT0ZnG-1715675988622)]
[外链图片转存中…(img-Am7QANv7-1715675988622)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!