IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> AS调试技巧 -> 正文阅读

[移动开发]AS调试技巧

一、定制自己的日志工具
代码如下:

public class LogUtil {
    public static final int VERBOSE = 1;
    public static final int DEBUG = 2;
    public static final int INFO = 3;
    public static final int WARN = 4;
    public static final int ERROR = 5;
    public static final int NOTHING = 6;
    public static int level = VERBOSE;
    public static void v(String tag,String msg){
        if(level <= VERBOSE){
            Log.v(tag,msg);
        }
    }
    public static void d(String tag,String msg){
        if(level <= DEBUG){
            Log.d(tag,msg);
        }
    }
    public static void i(String tag,String msg){
        if(level <= INFO){
            Log.i(tag,msg);
        }
    }
    public static void w(String tag,String msg){
        if(level <= WARN){
            Log.w(tag,msg);
        }
    }
    public static void e(String tag,String msg){
        if(level <= ERROR){
            Log.e(tag,msg);
        }
    }
}

原理:
1、首先定义了七个常量,其中前五个根据日志等级由低到高赋值;level可以指定为上面6个常量中的任意一个
2、然后写了五个方法,每个方法对应于日志中的一个方法,并进行一个判断,level的值是否小于指定的方法的日志值,若小于就可以打印日志,调用方法:LogUtil.d("TAG","debug log")
3、当将level的值指定为VERBOSE时,所有的日志都可以打印出来;若指定为NOTHING,则所有的日志都不能够打印

二、断点调试Android程序
1、添加断点的方式
在这里插入图片描述
2、启动调试
在这里插入图片描述
启动以后,会出现如下弹窗
在这里插入图片描述
4、打开debug界面,按F8代码就会向下执行一行,通过Variables试图可看到内存中的数据
在这里插入图片描述
在这里插入图片描述
5、此外,若是断点执行的代码位置很靠后,则可以用如下方法:直接运行程序,在程序运行成功后,点击如下按钮
在这里插入图片描述
就会出现如下界面
在这里插入图片描述
点击“OK”,该进程就会直接进入到调试模式
三、创建定时任务
3.1 Alarm机制
背景:每个手机都有自己的休眠策略,在长时间不操作的情况下会自动让CPU进入到休眠状态,而Alarm机制具有唤醒CPU的功能
用法:

  • 1、首先通过借助AlarmManager 类来实现,通过调用Context的getSystemService()方法来获取实例
        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
  • 2、接着调用AlarmManager的set()方法用于设置一个定时任务,
        long triggerAtTime = SystemClock.elapsedRealtime() + 10 *1000;
        manager.set(AlarmManager.ELAPSED_REALTIME,triggerAtTime,intent2);
 ① 这里首先设定了一个任务在10秒后执行
 ② set()方法中传入了三个参数:
 		第一个参数用于指定AlarmManager的工作类型:ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC、RTC_WAKEUP,其中
 				ELAPSED_REALTIME表示让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU
 			    ELAPSED_REALTIME_WAKEUP表示让定时任务的触发时间从系统开机开始算起,会唤醒CPU
 				RTC表示让定时任务的触发时间从1970.1.1 0点开始算起,但不会唤醒CPU
 				RTC_WAKEUP表示让定时任务的触发时间从1970.1.1 0点开始算起,会唤醒CPU;
 				其中:SystemClock.elapsedRealtime()可获取到系统开机至今所经历时间的毫秒数;SystemClock.currentTimeMillis()可获取到从1970.1.1 0点至今所经历时间的毫秒数
 		第二个参数用于指定定时任务触发的时间,以毫秒为单位
 		第三个参数是一个PendingIntent对象,用于指定处理定时任务的服务
 ③ set()方法下Alarm任务的触发时间会变得不准确,这是由于系统在耗电性方面进行优化,可以采用setExact()方法使得Alarm任务的触发时间必须准确无误
  • 3、实现一个长时间在后台定时运行的服务
public class AutoUpdateService extends Service {
    public AutoUpdateService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       new Thread(new Runnable() {
            @Override
            public void run() {
                //具体逻辑操作
            }
        }).start();
        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
        int anHour = 30 * 60 * 1000;
        long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
        Intent intent1 = new Intent(this,AutoUpdateService.class);
        PendingIntent intent2 = PendingIntent.getService(this,0,intent1,0);
        manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,intent2);
        return super.onStartCommand(intent, flags, startId);
    }
 
}

3.2 Doze模式
1、目的:极大幅度的演唱电池的使用寿命
2、工作过程:
在这里插入图片描述
3、在Doze模式下,系统会对CPU、网络、Alarm等活动进行限制;退出该模式后,则可以执行同步操作、Alarm任务等,具体在Doze模式下被限制的功能:
在这里插入图片描述
4、其中最后一点可以通过AlarmManager的setAndAllowWhileIdle()或setExacttAndAllowWhileIdle()方法实现定时任务在Doze模式下也能正常执行,这两个方法的区别跟set()和setExact()方法的区别是一样的
四、多窗口模式
1、多窗口模式下的生命周期:

  • 1)一个应用从正常运行状态进入到多窗口状态时,首先活动会被回收,接着又会重新创建
  • 2)另一个应用在进入多窗口模式,原来的应用会自动暂停
  • 3)一般情况下,执行哪一个应用时另一个应用就会暂停

2、若要改变进入多窗口模式时活动会被重新创建的默认行为,在注册文件中的指定活动的注册标签下进行配置如下语句:

		android:configChanges = "orientation|keyboardHidden|screenSize|screenLayout"

3、关于禁用多窗口模式,只需要在注册文件中application标签或者activity标签里添加如下语句即可:

		android:resizeableActivity = "false"

4、注意,上述禁用方式只适合Android的SDK版本>=24时才会有用,对于版本<24的应用,我们将活动设定为不允许横竖屏切换,也可以实现禁用多窗口模式

		android:screenOrientation = "portrait"(只支持竖屏) or "landscape"(只支持横屏)

五、Lambda表达式
详细学习:菜鸟教程 Lambda表达式
本质:是一种匿名方法,既没有方法名,也没有访问修饰符和返回值类型
适用范围:凡是只有一个待实现方法的接口,都可以适用Lambda表达式的写法
具体实施:

	定义:
	MyListener listener{
		String doSomething(String a,int b);
	}
	
	Lambda表达是实现:
		MyListener listener = (String a,int b)->{
		return a+b;
	};
	或者
	MyListener listener = (a,b)->{
		return a+b;
	};MyListener listener = (a,b)-> a+b
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:16:58  更:2021-09-12 13:17:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:35:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码