谨慎使用静态注册的BroadcastReceiver

在Android中,BroadcastReceiver有两种注册方式。

第一种是静态注册,在Androidmanifest.xml文件中以类似activity注册的方式进行注册。

第二种是动态注册,在onResume()中注册,在onPause()中注销。

一般而言,我们需要根据具体的使用场景来判断使用何种注册方式。

静态注册的特点是接收设备全局的相应广播,尽管静态注册看起来比较方便,但实际上是十分耗费资源的。

现在使用以下代码进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class WifiReceiver extends BroadcastReceiver{
public static final String FLAG = "WifiReceiver";

@Override
public void onReceive(Context arg0, Intent arg1) {
if (arg1.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
int state = arg1.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);

if (state == WifiManager.WIFI_STATE_DISABLED) {
Log.v(FLAG,"wifi is disabled!");
} else if (state == WifiManager.WIFI_STATE_ENABLED) {
Log.v(FLAG,"wifi is enabled!");
}
}

}

}

[转]Java中单例模式的实现

前言:

近日在看Effective JAVA这本书,看到这一条的时候去网上查找下资料,发现了这篇写的不错的博客,因此觉得没有重复造轮子的必要,特此转载。

原文:

Inspired by Effective Java.

Singleton模式是在编程实践中应用最广泛的几种设计模式之一。以前知道的,实现单例的方法有两种(下面的A、B)。刚刚在读《Effective Java的时候》学到一种新的更好的方法(E):单元素的枚举类型。同时通过网上资料也知道了其他两种方法(C、D)。最后一种在Java中从1.5版本开始支持,其他语言在验证后说明。

A.饿汉式(类加载的时候就创建实例)。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MaYun {

public static final Mayun instance = new Mayun(); //静态的final的MaYun

private MaYun() {
//MaYun诞生要做的事情

}

public void splitAlipay() {

System.out.println(“Alipay是我的啦!看你丫Yahoo绿眉绿眼的望着。。。”);

}

}

Call:MaYun.instance.splitAlipay();

Feature:可以通过反射机制攻击;线程安全[多个类加载器除外]。

Java中类的构造顺序

先看代码:

Father类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.zhenghuiyan.testorder;

public class Father {
public String fStr1 = "father1";
protected String fStr2 = "father2";
private String fStr3 = "father3";

{
System.out.println("Father common block be called");
}

static {
System.out.println("Father static block be called");
}

public Father() {
System.out.println("Father constructor be called");
}

}

首先是Father类,该类有一个默认构造函数,有一个static的代码块,为了方便查看结果,还有一个普通代码块。

[翻译]大牛告诉你一天时间能学些什么

为了学好一门编程语言,我们日复一日地看书、练习并参与实际的项目。就像马拉松,你坚持得越久,就收获得越多。在这样一个长期而乏味的时期内,你总是能有一些简短的时间——比如一天,去学点什么。学习到的这些技术将会给你带来巨大的满足感。

一个目前在谷歌工作的大牛,Jacob Jensen,给出了以下清单,清单上列出了一些你能在一天之内学会的技术。

  • 阅读你最喜欢的语言的手册。在过去,因为不知道python中有Counter计数器,我为此花费了许多时间。同时还得忍受因为使用字典充当计数器而不断出现的bug。有很多诸如此类的教训。

  • 申请一个stackOverFlow帐号并学会使用这个网站。如果你是一个母语为英语的程序员,却不知道stactOverFlow是一个很好的资源,那你就真的错了。

  • 独立实现一个简单的机器学习算法。并有一个完整的系统。就是说你读取一个简单的csv格式输入,把它划分成训练集和测试集,运行一个使用了可调整或者探索的超参数的简单算法,并且获得一份简单的相关统计输出。

  • 学习怎样在Excel中画一个线形图。

  • 学习怎样不使用Excel去画一个线性图。

代码实现Android流量统计

概述

尽管现在WIFI的覆盖范围越来越广,但是设备(在这里设备指手机或平板)流量的使用仍然是用户很关注的一个点。因此,在APP中加入流量统计模块对于提升用户体验(让用户可以知晓使用了多少流量,可以使用户使用APP时更加放心)有很大帮助。

Android使用的是Linux内核,在Linux系统里,所有信息都是以文件的形式存在的,因此在Android中,所有应用的流量信息都将被保存在操作系统的文件中。

对于Android2.2之前,流量信息存储在proc/net/dev(或者 proc/self/net/dev)文件下,我们解析文件即可得到流量信息。

在Android2.2(API Level 8)之后,系统提供了TrafficStats类,我们可以通过该类来获取流量信息。需要注意一点的是,有些设备不支持流量统计,具体表现是,当调用TrafficStats的方法时将返回TrafficStats.UNSUPPORTED,这种情况下,我们需要自己去解析/sys/class/net/ 下的log文件。

方法

以下是TrafficStats类的一些主要方法(摘录自android 官方API文档):

static long getMobileRxBytes()
Return number of bytes received across mobile networks since device boot.

static long getMobileRxPackets()
Return number of packets received across mobile networks since device boot.

static long getMobileTxBytes()
Return number of bytes transmitted across mobile networks since device boot.

static long getMobileTxPackets()
Return number of packets transmitted across mobile networks since device boot.

static long getTotalRxBytes()
Return number of bytes received since device boot.

static long getTotalRxPackets()
Return number of packets received since device boot.

static long getTotalTxBytes()
Return number of bytes transmitted since device boot.

static long getTotalTxPackets()
Return number of packets transmitted since device boot.

static long getUidRxBytes(int uid)
Return number of bytes received by the given UID since device boot.

static long getUidRxPackets(int uid)
Return number of packets received by the given UID since device boot.

static long getUidTcpRxBytes(int uid)
This method was deprecated in API level 18. Starting in JELLY_BEAN_MR2, transport layer statistics are no longer available, and will always return UNSUPPORTED.

static long getUidTxPackets(int uid)
Return number of packets transmitted by the given UID since device boot.
Fork me on GitHub