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的功能。

(1)Timer类
声明一个Timer对象,为其设定一个任务task,调用schedule方法完成延时操作

Timer timer = new Timer();
timer.schedule(task,毫秒数);

TimerTask task = new TimerTask() {
        @Override
        public void run() {
            //需要执行的操作
        }
    };

(2)Alarm机制
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("该条内容不会显示");

八、动态更新通知

要动态更改同一个通知,只需要在再次发出通知时调用同一个通知id。

九、定时循环执行操作

在对应类中声明Handler对象和建立一个任务子线程。

private Handler handler = new Handler(Looper.getMainLooper());    
      
private Runnable task =new Runnable() {    
   public void run() {    
	   handler.postDelayed(this,毫秒数);//设置延迟时间
	   //需要执行的代码  
   }     
};  

然后在需要执行操作的位置调用Handler对象的post()方法:

handler.post(task);

如此就实现了定时循环执行某任务的目的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值