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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android开发学习之进阶技巧 -> 正文阅读

[移动开发]Android开发学习之进阶技巧

一、全局获取Context

Android提供了一个Application类,每当程序启动的时候,系统会自动将这个类进行初始化。可以定制一个自己的Application类,便于管理程序内的一些全局状态信息,如Context。

  1. 新建类继承Application,设置私有静态全局变量context
  2. 重写其onCreate()方法,在其中用getApplicationContext()为context赋值
  3. 提供一个getContext()方法,将刚才获取的Context进行返回
  4. 在AndroidManifest中的application标签下进行指定:android:name=”com.example.test.新建类名”
    这样就实现了全局获取Context的机制,在项目任何需要使用Context的地方调用MyApplication.getContext()就可以了。

二、使用Intent传递对象

(1)Serializable方式
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。
实现了Serializable接口的类的对象,只需要调用Intent的putExtra()方法进行存和getSerializableExtra()取就可以了。

(2)Parcelable方式
除了Serializable方式外,Parcelable方式也可以达到一样的效果,不过Parcelable的原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent支持的类型。

  1. 首先让目标类实现Parcelable接口
  2. 重写describeContents()和writeToParcel()方法,前者直接返回0,后者需要调用writeXxx()方法,将目标类中的字段一一写出。
  3. 还必须在目标类中提供一个CREATOR常量,可以用创建Parcelable.Creator接口实现,并将泛型指定为目标类。
  4. 接着在Creator接口中重写出createFromParcel()和newArray()这两个方法,前者创建一个目标类对象使用readXxx()方法读取写出的字段,最后返回该对象;后者new一个目标类对象数组,并使用方法中传入的size作为数组大小即可。
  5. 然后同样使用Intent的putExtra()存对象,用getParcelableExtra()方法来取对象

三、定制日志工具

在项目的开发阶段,可能留下很多的日志代码,但是在程序发布时,会降低程序的运行效率和造成机密数据的泄露。因此,需要一个自定义的日志工具,在开发和维护时让日志打印出来,程序发布上线后屏蔽掉。

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);
        }
    }
}

只有level的值小于等于对应日志级别值的时候,才会将日志打印出来。因此只需要修改level的值,就可以自由控制日志的打印行为,在开发阶段指定为VERBOSE,发布阶段指定为NOTHING。

四、创建定时任务

Android中的定时任务一般有两种实现形式,一种是Java API中的Timer类,一种是Android的Alarm机制。前者不太适合需要长期在后台运行的定时任务,长时间不使用手机,CPU会进入休眠模式,组织Timer的正常进行。后者具有唤醒CPU的功能。
Alarm机制借助AlarmMananger类来实现,通过调用Context的getSystemService()方法来获取实例,传入的参数是Context.ALARM_SERVICE。即获取实例的操作为:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

接下来调用AlarmManager的set()方法就可以设置定时任务了:

long triggerAtTime = SystemClock.elapsedRealtime()+10*1000;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime, pendingIntent);

该方法的第一个参数用于指定AlarmManager的工作类型,有四种值可选:
ELAPSED_REALTIME\ELAPSED_REALTIME_WAKEUP\RTC\RTC_WAKEUP
前两者表示让定时任务的触发时间从系统开机开始算起,但WAKEUP会唤醒CPU。后两者让定时任务的时间从1970年1月1日算起,同样WAKEUP唤醒CPU。
使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,System.currentTimeMillis()方法可以获取到1970年1月1日至今所经历的毫秒数。
第二个参数时任务触发时间;第三个参数是PendingIntent,这样定时任务被触发的时候,服务的onStartCommand()方法或广播接收器的nReceive方法就可以得到执行。
因为电量优化,set()方法不一定保证时间准确,改用setExact()基本可以保证时间的准确。

五、多窗口模式

Android系统支持屏幕同时显示两个应用程序,多窗口模式并不会改变活动原有的生命周期:与用户交互的那个活动设置为运行状态,另一个设置为暂停状态。
API版本在24及以上可以通过android:resizeableActivity。设置为true表示支持多窗口模式,设置为false表示不支持多窗口模式,不配置默认为true。
API版本在24以下只能通过设置是否允许横竖屏切换来控制是否支持多窗口。属性android:screenOrientation。设置为portrait表示只支持竖屏,设置为landscape表示只支持横屏

六、Lambda表达式

Lambda表达式本质是一种匿名方法,既没有方法名,即没有访问修饰符和返回值类型,用他编写的代码更简洁易读。
只要是符合接口中只有一个待实现方法的这个规则,都可以用lambda表达式编写。

七、在活动中获取另一个布局文件的控件

在一个活动中需要获取不是绑定到该活动的其他布局文件中的控件的实例,可以采用以下方法:

LayoutInflater layoutInflater = LayoutInflater.from(当前类.this);
View view = layoutInflater.inflate(R.layout.目标布局文件,null);
TextView targetText = (TextView) view.findViewById(R.id.目标控件);

注意:如果该布局已在动态获取前创建,此方法获取的布局view是一个新创建的布局,通过view获取和更新控件,在界面中可能无效。
如:targetText.setText("该条内容不会显示");

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:31:59  更:2021-08-11 12:32:39 
 
开发: 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年5日历 -2024/5/19 8:17:55-

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