个人笔记整理
继续进阶—应该掌握的高级技巧
全局获取Context技巧
定义一个MyApp类,继承Application
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}
指定name属性<application android:name="MyApplication" ...>
使用Intent传递对象
Serializable方式
直接让实体类实现Serializable接口
public class Person implements Serializable{
传递时
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("person_data");
Parcelable方式
实体类
public class Person implements Parcelable {
private String name;
private int age;
...
@Override
public int describeContents() {
// describeContents() 方法直接返回0就可以了
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name); // 写出name
dest.writeInt(age); // 写出age
/**
* 而writeToParcel() 方法中我们需要调用Parcel的writeXxx() 方法,将Person 类中的字段一一写出。注意,字符串型数据就调用writeString()方法,整型数据就调用writeInt() 方法,以此类推。
**/
}
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(); // 读取name
person.age = source.readInt(); // 读取age
return person;
// 读取存入,并返回对象
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
传递方法相同
读取时
Person person = (Person) getIntent().getParcelableExtra("person_data");
自己的日志打印工具
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 等于VERBOSE 就可以把所有的日志都打印出来,让level 等于WARN 就可以只打印警告以上级别的日志,让level 等于NOTHING 就可以把所有日志都屏蔽掉。
创建定时任务
Alarm机制
public class LongRunningService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
// 在这里执行具体的逻辑操作
}
}).start();
// 获得Alarm管理
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
int anHour = 60 * 60 * 1000; // 这是一小时的毫秒数
// 下次执行的时间
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
Intent i = new Intent(this, LongRunningService.class);
// 启动的意图
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
// 进行设置
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
return super.onStartCommand(intent, flags, startId);
}
}
要求时间准确,使用setExact()
代替set()
Doze模式:调用AlarmManager的setAndAllowWhileIdle() 或setExactAndAllowWhileIdle() 方法就能让定时任务即使在Doze模式下也能正常执行