Android开发(11):继续进阶—应该掌握的高级技巧

个人笔记整理

继续进阶—应该掌握的高级技巧

全局获取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模式下也能正常执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forgo7ten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值