Android 高级进阶常用技巧

版权声明:转载请申明出处,谢谢 https://blog.csdn.net/qq_35495763/article/details/86670692

update time :2019-1-28 Author:要你命三千又三千 type:学习笔记

1.实现随时随地获取Context 的方案

这里提供了一个简单的解决方案

public class MyApplication extends Application {

	private static Context context;

	@Override
	public void onCreate() {
		super.onCreate();
  	    context = getApplicationContext();
	}
	//添加静态方法获取Context来使用
	public static Context getContext() {
		return context;
	}
MyApplication.getContext()来获取Context的使用

2.使用Intent来传递对象

原理:两种实现方式

Serializable 和Parcelable方式

Serializable方式
对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 ,那反序列化就是从二进制流(序列)转化为对象的过程.

Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现 Serializable 这个接口就可以了
Serializable是Java为我们提供的一个标准化的序列化接口
整个流程
步骤一
序列化对象

public class Person implements Serializable {
   private String name;
   private int age;
   public String getName(){
    	return name;
   }
   public void setName(){
		this.name=name;
   }
   public int getAge(){
		return age;
	}
	public void setAge(){
 		this.age=age;
	}
}

步骤二:实现对象传输

		Person person = new Person();
		person.setName("Tom");
		person.setAge(20);
		Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
		intent.putExtra("person_data", person);
		startActivity(intent);

步骤三:获取对象

Person person =(Person)getIntent().getSerializableExtra("persondata"

方式二:使用Paracelable实现方式

Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用相对复杂一些,但Parcelable的效率相对Serializable也高很多,这一直是Google工程师引以为傲的,有时间的可以看一下Parcelable和Serializable的效率对比 Parcelable vs Serializable

关键字:序列化接口,Google提供

实现原理

Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是 Intent 所支持的数据类型,这样也就实现传递对象的功能了.

步骤一:对Parcelable进行实现

public class Person implements Parcelable{
	private String name;
	priavate int age;

 	@Override
 	public int describeContents(){
 		return 0;
	}
	//将对象分解传输
	@Override
	public void writeToParcel(Parcel dest,int flags){
		dest.writeString(name);
		dest.writeInt(age);
	}		
    //SDK api谷歌文档的解释:
    //必须实现的接口,并作为公共CREATOR字段提供,该字段从Parcel生成    
    //Parcelable类的实例
    public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){
	将对象还原
	@Override
	public Person createFromParcel(Parcel source){
		Person person =new Person();
	    person.name=source.readString();
	    person.age=source.readInt();
	    return person;
	}	
	@Override
	public Person[] newArray(int size){
		return new Person[size];
	}
	};
	


}

3.实现发布时屏蔽日志打印

问题场景:
你正在编写一个比较庞大的项目,期间为了方便调试,在代码的很多地方都
打印了大量的日志。最近项目已经基本完成了,但是却有一个非常让人头疼的问题,之前用于调试的那些日志,在项目正式上线之后仍然会照常打印,这样不仅会降低程序的运行效率,还有可能将一些机密性的数据泄露出去。
由于打印打印的地方众多,不可能一个一个删除,如何解决?
如何实现一次性屏蔽所有打印的日志

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

通过以上函数,
开发时使用

LogUtil.v(TAG,Msg);

发布时

public static final int LEVEL = NOTHING ;
即可屏蔽所有打印的日志信息。

猜你喜欢

转载自blog.csdn.net/qq_35495763/article/details/86670692