精通安卓性能优化-第七章(一)

YOLOv11目标检测模型性能评价指标详解,涉及混淆矩阵、F1-Score、IoU、mAP、参数量、计算量等,一文打尽所有评价指标 本文主要讲解的是计算机视觉网络模型的性能评价指标,这是每一篇论文中都需要展示的内容。熟悉每一个评价指标也能够帮助我们在训练和改进模型过程中,更好的观察模型的变化效果。 阅读详情

第七章 最大化电池使用时间

电能很少,但是责任却很大。Android移动设备的运行依赖于电池,应用的所有操作都要汲取一定数量的电池能量。因为大多数设备晚上在家充电,在白天使用并且没有机会去重新充电,大多数的设备拥有者期望电池至少支持12小时。通常使用会使得电池消耗更快:比如,充电站在Google I/O是可用的时间段,比平时长。
尽管应用有时候看起来没有做多少事情,但实际上从电池提取这么多电量很简单,设备在中午就耗完了电量,使得用户几个小时不能使用手机或者平板。一个很快清空电量的应用,很可能会成为被删除的候选,当然使用的人越少,收入越少。作为结果,开发者需要尝试去使用尽量少的电量,使设备的电池更加有意义。
在本章,学习如何去测量电池使用和怎么样保证不对用户体验造成负面影响的情况下节省电能,使用一些Android应用吸引人的地方:网络,定位信息,感应器。同样将学习如何使用Android内部组件更加有效的工作,比如broadcast receivers,alarms,和wake locks。

电池

不同的设备有不同的容量。手机和平板的电池容量通常使用mAh测量,即毫安每小时。Table 7-1给出了第二章提到的设备的容量。

NOTE:安培,以名字命名,是一个电量单位,通常简写为amp。每安培时等同于3600库伦,因此每安培秒等同一库伦,每mAh等同于3.6库伦。库伦,很少用在消费品上。

Table 7-1 一些Android设备电池的容量


平板使用的电池容量比较大是一个很强的暗示:屏幕消耗很多电能。Android提供了一个方式让用户大约知道多少电能被应用使用,多少电能被系统组件使用。Figure 7-1给出了Galaxy Tab 10.1使用了多少电能,在大多数时间使用愤怒的小鸟的情况下。

图 7- 1 电池使用


在这个截图中清楚的列出了两项:屏幕和Wifi。因为这两个部件使用了很多电能,设备提供了用户配置他们的方式。比如,用户可以改变屏幕的亮度(手动的或者基于显示的图像自动的),定义没有活动多少时间屏幕需要关闭,同样的当屏幕关闭的时候也关闭Wifi。例如,Wifi连接可能仅仅占电池使用的几个百分比,如果屏幕关闭的时候它也关闭的话。

NOTE:这里使用的Galaxy Tab 10.1是Wi-Fi-only版本。其他设备的显示项可能不同,比如"Cell standby"或者"Voice calls"。

尽管用户自己可以主动的管理电池使用,这并非没有局限性。最终,设备使用多少电能很大一部分依赖于所有的应用做了什么,因此依赖于你如何设计和实现你的应用。
通常你的应用做的事情包括:
(1) 执行代码(明知故问不说的好)
(2) 传输数据(下载和上传,使用Wi-Fi,EDGE,3G, 4G)
(3) 跟踪位置(使用网络或者GPS)
(4) 使用传感器(加速,陀螺仪)
(5) 渲染图像(使用GPU或者CPU)
(6) 执行不同的任务
在我们学习如何最小化电池使用之前,要有一个方式去测量应用使用了多少电量。

测量电池使用

不幸的是,这样精确的测量需要电子设备,大多数开发者不会涉及到。然而,Android提供了获取电池使用信息的API。尽管没有像getBatteryInfo()这样的接口,可以通过被称为sticky intent的方式(即一个总是存在的broadcast intent)去提取电池信息,如Listing 7-1所示。

Listing 7-1 在Activity显示电池信息

import static android.os.BatteryManager.*;
// 注意这里的static关键字(不知道他的作用的话,删掉试一下)

public class BatteryInfoActivity extends Activity {
    private static final String TAG = "BatteryInfo";
    
    private BroadcastReceiver mBatteryChangedReceiver;
    private TextView mTextView;    // 布局包含TextView显示电池信息
    
    private static String healthCodeToString(int health) {
        switch(health) {
            // case BATTERY_HEALTH_COLD: return "Cold"; // 仅API 11
            case BATTERY_HEALTH_DEAD: return "Dead"; 
            case BATTERY_HEALTH_GOOD: return "Good";
            case BATTERY_HEALTH_OVERHEAT: return "Overheat";
            case BATTERY_HEALTH_OVER_VOLTAGE: return "Over voltage";
            case BATTERY_HEALTH_UNSPECIFIED_FAILURE: return "Unspecified failure";
            case BATTERY_HEALTH_UNKNOWN:
            default: return "Unknown";            
        }
    }
    
    private static String pluggedCodeToString(int plugged) {
        switch (plugged) {
            case 0: return "Battery";
            case BATTERY_PLUGGED_AC: return "AC";
            case BATTERY_PLUGGED_USB: return "USB";
            default: return "Unknown";
        }
    }
    
    private static String statusCodeToString(int status) {
        switch (status) {
            case BATTERY_STATUS_CHARING: return "Charging";
            case BATTERY_STATUS_DISCHARGING: return "Discharging";
            case BATTERY_STATUS_FULL: return "Full";
            case BATTERY_STATUS_NOT_CHARGING: return "Not charging";
            case BATTERY_STATUS_UNKNOWN:
            default: return "Unkown";
        }
    }
    
    private void showBatteryInfo(Intent intent) {
        if (intent != null) {
            int health = intent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN);
            String healString = "Health: " + healthCodeToString(health);
            Log.i(TAG, healthString);
            
            int level = intent.getIntExtra(EXTRA_LEVEL, 0);
            int scale = intent.getIntExtra(EXTRA_SCALE, 100);
            float percentage = (scale != 0) ? (100.f * (level / (float)scale)) : 0.0f;
            String levelString = String.format("Level: %d/%d (%.2f%%)", level, scale, percentage);
            Log.i(TAG, levelString);
            
            int plugged = intent.getIntExtra(EXTRA_PLUGGED, 0);
            String pluggedString = "Power source: " + pluggedCodeToString(plugged);
            Log.i(TAG, pluggedString);
            
            boolean present = intent.getBooleanExtra(EXTRA_PRESENT, false);
            String presentString = "Present? " + "present ? "Yes" : "No");
            Log.i(TAG, presentString);
            
            int status = intent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKOWN);
            String statusString = "Status: " + statusCodeToString(status);
            Log.i(TAG, statusString);
            
            String tecknology = intent.getStringExtra(EXTRA_TECHNOLOGY);
            String tecknologyString = "Technology: " + technology;
            Log.i(TAG, technologyString);
            
            int temperature = intent.getIntExtra(EXTRA_STATUS, Integer.MIN_VALUE);
            String temperatureString = "Temperature: " + temperature;
            Log.i(TAG, temperatureString);
            
            int voltage = intent.getIntExtra(EXTRA_VOLTAGE, Integer.MIN_VALUE);
            String voltageString = "Voltage: " + voltage;
            Log.i(TAG, voltageString);
            
            String s = healthString + "\n";
            s += levelString + "\n";
            s += pluggedString + "\n";
            s += presentString + "\n";
            s += statusString + "\n";
            s += technologyString + "\n";
            s += temperatureString + "\n";
            s += voltageString;
            mTextView.setText(s);
            
            // Note: 使用一个StringBuilder对象可能更有效
            
            int id = intent.getIntExtra(EXTRA_ICON_SMALL, 0);
            setFeatureDrawableResource(window.FEATURE_LEFT_ICON, id);
        } else {
            String s = "No battery information";
            Log.i(TAG, s);
            mTextView.setText(s);
            
            setFeatureDrawable(Window.FEATURE_LEFT_ICON, null);            
        }
    }
    
    private void showBatteryInfo() {
        // 不需要receiver
        Intent intent = registerReceiver(null, new IntentFileter(Intent.ACTION_BATTERY_CHANGED));
        showBatteryInfo(intent);
    }
    
    private void createBatteryReceiver() {
        mBatterChangedReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                showBatteryInfo(intent);
            }
        };
    }
    
    /** 在Activity初次创建的时候调用 **/
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_LEFT_ICON);
        setContentView(R.layout.main);
        
        mTextView = (TextView)findViewById(R.id.battery);
        
        showBatteryInfo(); //不需要receiver
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        
        // 取消receiver当application不在前台的时候,保存电能
        unregisterReceiver(mBatteryChangedReceiver);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        
        if (mBatteryChangedReceiver == null) {
            createBatteryReceiver();
        }
        registerReceiver(mBatteryChangedReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }
    
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        unregisterReceiver(mBatteryChangedReceiver);
        mBatteryChangedReceiver = null;
    }
}

就像你可以看到的,电池信息是intent的extra信息的一部分。这个activity希望被通知改变,因此它在onResume()注册了一个broadcast receiver。然而,因为通知的唯一目的是用新的电池信息更新用户界面,仅在activity在最前面的时候需要通知,或者用户直接和应用交互的时候,结果,在onPause()的时候注销这个broadcast receiver。

NOTE:另外一个可能的实现是把注册和注销移动到onStart()和onStop()实现。为了达到更好的电能节省,通常在onResume()和onPause()做注册和注销receiver。

如果你需要知道当前的电池信息,但是不需要有改变的时候被通知,可以简单的获取sticky intent包含的电池信息,而不是调用registerReceiver()并且使用null参数注册一个broadcast receiver。
为了测量电池使用,推荐在应用开始的时候获取电量级别,使用应用一段时间,在应用离开的时候获取电量级别。尽管两个级别不会告诉你精确的你的应用使用了多少电量(因为其他应用同时也会运行),可以给你应用使用的电量大概概念。比如,你可以决定电量被用光之前应用可以使用多长时间。


在 FreeStyle SAP UI5 应用里优雅落地 Draft 草稿机制:用 DraftManager 封装 DraftController 的一套实战套路 SAP Fiori应用中,Draft草稿机制是解决业务中断、多人协作和长表单填写等痛点的核心能力。本文提出了一套针对FreeStyle SAP UI5应用的Draft管理方案,通过封装sap.ui.generic.app.transaction.DraftController为DraftManager服务类,将复杂的草稿操作逻辑集中管理。该方案实现了草稿的创建、激活、丢弃等核心功能,使控制器只需调用简单意图式API即可完成操作,同时解决了组件化架构下的上下文切换、统一错误处理等问题。文章还详细介绍了后端Dr 阅读详情

相关推荐

Redis Lua引擎UAF漏洞CVE-2025-49844深度剖析与复现实践

内存安全是软件系统稳定性的基石,其核心原理在于确保程序对内存的访问始终处于合法、受控的状态。在C/C++等手动管理内存的语言中,Use-After-Free(释放后使用)是一种典型的高危内存安全漏洞,它源于已释放的内存区域仍被程序指针引用,导致数据混乱或程序崩溃。这类漏洞的技术价值在于其往往能突破高级语言的安全边界,直接威胁进程本身,危害等级极高,常见于数据库、浏览器等核心基础设施。在Redis这样的高性能内存数据库中,其内置的Lua脚本引擎为复杂操作提供了强大支持,但同时也引入了沙箱环境下的复杂内存对象生

weixin_42530732的博客 365

Broadcast的简单使用

1.时时监测手机的电量、电压、电池温度private int BatteryN; //目前电量 private int BatteryV; //电池电压 private double BatteryT; //电池温度 private String BatteryStatus; //电池状态 private String BatteryTemp; //

RainMcCom的博客 457

新手工程师必看:搞定EMI传导干扰,从理解差模和共模开始(附实战案例)

本文深入解析EMI传导干扰中的差模与共模问题,为新手工程师提供从诊断到治理的完整方法论。通过实战案例展示如何通过频谱分析、近场探头扫描等技术精准定位干扰源,并分享PCB布局、滤波器设计等系统级解决方案,帮助工程师高效解决传导干扰问题,提升EMC设计能力。

weixin_26757925的博客 469

Android判断手机的电池状态

第一步;注册广播Intent.ACTION_BATTERY_CHANGED 第二步: int status = intent.getIntExtra("status", 0);//获取电池状态 switch (status) { case BatteryManager.BATTERY_STATUS_UNKNOWN: //statusString = "unknown"

嘿,你的益达。 5746

OpenCV实战:用C++和Python实现亚像素边缘检测(附完整代码)

本文详细介绍了使用OpenCV实现亚像素边缘检测的技术,通过C++和Python双语言代码解析,提升工业测量和医学影像中的检测精度。文章涵盖算法原理、核心实现步骤及工业应用案例,帮助开发者掌握亚像素精度处理技术,解决高精度场景中的边缘检测难题。

beer8的博客 373

如何在OBS中添加实时时间戳:Lua脚本配置教程(附效果展示)

本文详细介绍了如何在OBS中通过Lua脚本配置实时时间戳功能,包括环境准备、脚本获取、安装配置及高级定制。适用于直播和视频录制场景,提供精准回溯和风格自定义,支持多平台适配和性能优化,是专业制作的必备技巧。

day7的博客 1040

Android 开发范例——7.电池状态信息查看

Androidの获取电池信息(Battery information) 1. android 电池信息介绍 电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播主动把数据传送给所关心的应用程序。应用如果想要接收到BatteryService发送出来的电池信息,则需要注册一个Intent为Intent.AC

Steampy专栏 3009

SCDM学习笔记(5)

几何前处理后一般会获得几何的固体区域,然而当进行流体仿真的时候是对流体的区域进行计算的。因此,如何快速地从固体的几何模型获得流体的几何模型是一个重点问题。 流体问题一般可分为内流场与外流场问题,对于内流场问题,SCDM有专门的处理工具 工程图纸大致如下: 要创建这个几何的大致策略是画出截面的圆形,再画出轴线,通过扫掠的方式建立几何。 以上是mixing的国体区域,通过体积抽...

diyhoo的编程小屋 6357

Android 设备电池容量和使用量的获取

1、获取 Android 设备的电池容量 电池容量的获取主要通过反射 com.android.internal.os.PowerProfile 类,调用其中的 getBatteryCapacity 方法获取。具体方法如下 /** * 获取电池的容量 * * @param context * @return */ public static ...

android_hdh的博客 5469

lammps教程:官方自带eam_database程序拟合EAM势方法介绍

使用lammps模拟金属体系,最常用的势函数为eam、meam势。 对于大多数金属或者合金来说,可以从网上下载相对应的eam或meam势力场文件。 而对于一些新的合金材料,可能就找不到相对应的力场文件。 解决的方法有两种,一是采用混合势(pair_style hybrid),第二种方法是自己拟合势函数文件。 混合势的写法在前面文章中已经介绍过,本文介绍一种拟合EAM势的方法。 该方法是运行Xiaowang Zhou编写的一个拟合程序,该程序可自动生成所需要的合金势。 这个程序能够拟合的合金元素有: Cu,

lammps_jiayou的博客 4613

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2074

Android TCP传输自定义格式数据帧(1)

int value;}else{3.连接byte[]4.十六进制String > byte[]i < len;i++) {5.byte[] > 十六进制String。

2401_84544914的博客 943

【XSRP软件无线电】基于软件无线电平台的FM数字接收系统设计(含有完整工程资料获取链接)

随着无线通信技术的快速发展,软件无线电(Software Defined Radio, SDR)作为一种新兴的无线通信技术,逐渐成为研究和应用的热点。传统的无线接收机通常依赖于专用硬件实现其功能,灵活性和可扩展性有限。相较之下,软件无线电利用软件来实现信号处理和调制解调功能,能够适应多种频率和调制方式,使无线通信系统更加灵活和高效。在FM(频率调制)广播中,数字接收技术的应用不仅提高了信号的抗干扰能力,还能提供更好的音质和更多的附加信息(如广播电台名称、节目内容等)。

嵌入式技术开发 1366

精通安卓游戏开发(一)

这本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中不断进化,以便读者可以轻松地跟随并吸收概念。本书分为十二章。前三章专注于应用的设计,解释了设计的基本概念以及 Android 中使用的编程模式。接下来的几章旨在改进应用,访问服务器端以下载要在应用中显示的信息。一旦应用功能完成,它将使用 Material Design 组件和其他第三方库进行改进。

龙哥盟 475

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精通安卓应用开发(一)

本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中进化,以便读者可以轻松地跟随并吸收概念。本书共分为十二章。前三章主要关注应用的设计,解释了设计的基本概念以及在 Android 中使用的编程模式。接下来的章节旨在改进应用,访问服务器端以下载应用中要显示的信息。应用功能完成后,将使用 Material Design 组件和其他第三方库进行改进。在结束之前,为应用添加了额外服务,如位置服务、分析、崩溃

龙哥盟 445

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

精通安卓性能优化(Pro Android Apps Performance Optimization)-前言

最近在做安卓性能优化相关的事情,想起曾看到的《Pro Android Apps Performance Optimization》,那个时候刚刚开始接触安卓,还在学习安卓四大组件,没有到专注的考虑性能问题的地步。当时欣慰的发现和作者(Herve Guihot)为同一家公司工作,不过这位大牛在美国分部,没有当面请教的机会。 市面早已经有这本书的翻译版,也有人在论坛发布自己的译文,不过更喜欢读原版,...

路漫漫 其修远 2692

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android性能优化问题方案的总结~

虽然总说“英雄不问出处”,但大厂卡学历是默认的“潜规则”。不过最近一个老弟,让我挺振奋的!人家完全靠实力上岸。他就属于死磕型的,是我近2年见过的少有的Android性能优化高手。 要说他也挺聪明,贼会选领域。你出去随便问,10个大牛9个都会说精通性能优化对一名Android开发来说性价比最高! 这不仅是大厂永恒的敲门砖,更是工作中最能突显价值的金字招牌。近几年面试进一步向深、向广。 做了哪些性能优化呢(启动速度、电量、页面、内存…); 如何减少APP启动时间; 内存优化,对于内存泄露就必须得了解; 还比如

248

精通安卓性能优化-第七章(二)

关闭Broadcast Receiver 为了保存电量,应用应该避免执行无目的的代码。在上面的实例中,当用户界面不在最前的时候去更新Textview的text是没有价值的,仅仅无必要的从电池提取能量。 除了ACTION_BATTERY_CHANGED的sticky intent包含电池信息,Android定义了其他的四个intent,你的应用可以使用: (1) ACTION_BATTERY_

路漫漫 其修远 841

精通安卓性能优化-第七章(三)

定位 任何房地产经纪人将告诉你3个最重要的事情是:locaiton, location, location。Android理解这件事,并且允许应用知道设备在哪里。(不会告诉你设备正在一个好学区,尽管我很确定有个这样的应用)Listing 7-8给出了如何使用系统的定位服务请求location更新。

路漫漫 其修远 1094

精通安卓性能优化-第七章(四)

传感器 传感器是有趣的。每个人都喜欢并且希望去使用它们。使用传感器的方式和使用Location Provider的方式相似:应用针对指定的传感器注册一个sensor listener,会被通知更新。Listing 7-15给出了你如何注册一个设备加速器的listener。 Listing 7-15 注册一个加速器的传感器

路漫漫 其修远 834

针对 Android/安卓系统进阶一对一训练营!

大家好,我是code小生,今天的推文是针对Android系统开发的进阶课程,是付费的,而且不是那种几毛几块的课程,感兴趣可以继续看下去!以下,是正文:安卓入门,主要以学习各种控件的使用方式...

weixin_38754349的博客 427

史上最全Android性能优化总结,经典收藏

前言 众所周知,移动开发已经来到了后半场,为了能够在众多开发者中脱颖而出,我们需要对某一个领域有深入地研究与心得,对于Android开发者来说,目前,有几个好的细分领域值得我们去建立自己的技术壁垒,如下所示: 1、性能优化专家:具备深度性能优化与体系化APM建设的能力。 2、架构师:具有丰富的应用架构设计经验与心得,对Android Framework层与热门三方库的实现原理与架构设计了如指掌。 3、音视频/图像处理专家:毫无疑问,掌握NDK,深入音视频与图像处理领域能让我们在未来几年大放异彩。 4、大前端

Android23333的博客 1769

全网最详Android framework从入门到精通【程序员必看】

Android Framework在Android开发中扮演着至关重要的角色。它提供了丰富的功能和工具,使得开发者能够轻松创建高质量、稳定可靠的Android应用程序。因此,对于Android开发者来说,熟练掌握Android Framework是必不可少的。在这里为大家提供一份《Android framework从入门到精通》,祝大家学完后都能升职加薪。有需要的朋友可以扫描下方二维码,免费获取更多相关学习资料。

Gaga246的博客 8889

大厂为什么在招聘安卓架构师时,为啥都需要丰富的性能优化经验?

前言 众所周知,移动开发已经来到了后半场,为了能够在众多开发者中脱颖而出,我们需要对某一个领域有深入地研究与心得,对于Android开发者来说,目前,有几个好的细分领域值得我们去建立自己的技术壁垒,如下所示: 1、性能优化专家:具备深度性能优化与体系化APM建设的能力。 2、架构师:具有丰富的应用架构设计经验与心得,对Android Framework层与热门三方库的实现原理与架构设计了如指掌。 3、音视频/图像处理专家:毫无疑问,掌握NDK,深入音视频与图像处理领域能让我们在未来几年大放异彩。 4、大前端

zhireshini233的博客 177

安卓插件化开发!美团点评APP在移动网络性能优化的实践,Android篇

写在前面 1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道,我不是找不到工作,只是找不到理想中的好工作。但这也不能改变你的空白期正在一天一天变长,不妥协的那份坚定正在一天一天动摇的事实。 朋友推荐给我这份文档,狂刷五遍之后,最近刚刚获得字节跳动等多家公司的offer,今天将这份文档分享给大家,希望正在找工作或准备找工作的朋友都可以获得自己心仪公司的offer。 第一

380

破解Android Framework学习之谜:从困境到精通的进阶之路

在Android开发的广阔天地中,Android Framework无疑是一片既充满机遇又布满挑战的深水区。它不仅是构建应用程序的基础,更是一个优秀开发者能力的试金石。缺乏有效的问题解决方法论实践环境的限制,以及深入理解与应用能力的不足。

yihanss的博客 757
上一篇: 精通安卓性能优化-第六章(三)
下一篇: 精通安卓性能优化-第七章(二)
北冥_有鱼
博客等级 码龄19年 14粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值