Android开发学习之进阶技巧
Posted 哈喽喔德
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发学习之进阶技巧相关的知识,希望对你有一定的参考价值。
一、全局获取Context
android提供了一个Application类,每当程序启动的时候,系统会自动将这个类进行初始化。可以定制一个自己的Application类,便于管理程序内的一些全局状态信息,如Context。
- 新建类继承Application,设置私有静态全局变量context
- 重写其onCreate()方法,在其中用getApplicationContext()为context赋值
- 提供一个getContext()方法,将刚才获取的Context进行返回
- 在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支持的类型。
- 首先让目标类实现Parcelable接口
- 重写describeContents()和writeToParcel()方法,前者直接返回0,后者需要调用writeXxx()方法,将目标类中的字段一一写出。
- 还必须在目标类中提供一个CREATOR常量,可以用创建Parcelable.Creator接口实现,并将泛型指定为目标类。
- 接着在Creator接口中重写出createFromParcel()和newArray()这两个方法,前者创建一个目标类对象使用readXxx()方法读取写出的字段,最后返回该对象;后者new一个目标类对象数组,并使用方法中传入的size作为数组大小即可。
- 然后同样使用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("该条内容不会显示");
以上是关于Android开发学习之进阶技巧的主要内容,如果未能解决你的问题,请参考以下文章
分享《深度学习之TensorFlow:入门原理与进阶实战》PDF+源代码
分享《深度学习之TensorFlow:入门原理与进阶实战》PDF+源代码
分享《深度学习之TensorFlow:入门原理与进阶实战》PDF+源代码
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情