1. 广播机制二
BroadcastReceiver用于监听被广播的事件(Intent),为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
1).在AndroidManifest.xml文件中进行注册
本方法已经在第21集中讲过,它有一个特点:即使这个应用程序被关闭了,依然能够接收到这类广播事件。
2).在应用程序的代码中进行注册,两个方法:
registerReceiver(BroadcastReceiver receiver,IntentFilter filter);//注册
unregisterReceiver(BroadcastReceiver receiver);//取消注册
如果一个BroadcastReceiver用于更新UI,那么通常会使用这种方法进行注册,在Activity启动的时候注册BroadcastReceiver,在Activity不可见以后取消注册。
注册的时候:
//这个类SMSReceiver是自定义的,也继承于BroadcastReceiver
SMSReceiver receiver = new SMSReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(“android.provider.Telephony.SMS_RECEIVED”);
MainActivity.this.registerReceiver(receiver,filter);
红色部分表示监听的是接收短信的广播事件。如何给模拟器发送短信呢?
在Eclipse中选择DDMS面板,找到Emulator Control视图,输入number(这个number就是发送方的号码)后选择SMS,编辑信息,点击send即可。
取消注册的时候:
MainActivity.this.unregisterReceiver(receiver);
在Android平台当中,内置了很多Action,用于帮助开发者监听手机上所发生的各种事件,下面是一些比较常见的Action(这些Action是Intent类中的常量):
Action名称:触发场景
ACTION_CAMERA_BUTTON:当按下照相机的按钮时触发
ACTION_BATTERY_LOW:当电量低的时候触发
ACTION_DATE_CHANGED:当日期改变的时候触发
ACTION_POWER_CONNECTED:当外加电源接通的时候触发
ACTION_REBOOT:当系统重启的时候触发
ACTION_SCREEN_ON:当屏幕点亮的时候触发
在广播事件中,Intent中保存了广播的内容,接收到短信后,如何在BroadcastReceiver中进行处理呢?
1
2
3
4
5
6
7
8
9
10
11
|
//通过intent获取bundle对象
Bundle bundle = intent.getExtras();
//在Bundle对象中有一个名为pdus的属性,这个属性的值是一个Object数组
Object[] objs = (Object[])bundle.get(“pdus”);
SmsMessage[] messages =
new
SmsMessage[objs.length];
for
(
int
I =
0
; i<objs.length; i++){
//使用Object数组当中的对象创建SmsMessage对象
messages[i] = SmsMessage.createFromPdu((
byte
[])objs[i]);
//调用SmsMessage对象的getDisplayMessageBody()方法可以得到消息的内容
System.out.println(messages[i].getDisplayMessageBody();
}
|
2. WIFI网络操作
1.WIFI网卡的状态是由一系列的整型常量来表示的:
WIFI_STATE_DISABLED:WIFI不可用
WIFI_STATE_DISABLING:WIFI正在关闭
WIFI_STATE_ENABLED:WIFI可用
WIFI_STATE_ENABLING:WIFI正在打开
WIFI_STATE_UNKNOWN:WIFI状态未知
2.WIFI操作是需要权限的,这里是部分权限
CHANGE_NETWORK_STATE:改变网络状态
CHANGE_WIFI_STATE:改变WIFI状态
ACCESS_NETWORK_STATE:访问网络状态
ACCESS_WIFI_STATE:访问WIFI状态
3.对WIFI网卡进行操作需要通过WifiManager对象来进行:
获取WifiManager:
1
|
WifiManager wifiManager = (WifiManager)Context.getSystemService(Service.WIFI_SERVICE);
|
操作WIFI网卡:
1
2
3
|
wifiManager.setWifiEnabled(
true
);
// 打开WIFI
wifiManager.setWifiEnabled(
false
);
//关闭WIFI
wifiManager.getWifiState();
//获取WIFI的当前状态
|
3. Socket编程
基于TCP协议的Socket编程:不多说。
基于UDP协议的Socket编程:
1.服务端:
1
2
3
4
5
6
7
8
9
10
|
//创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket =
new
DatagramSocked(
4567
);
byte
[] data =
new
byte
[
1024
];
//用于存放接收到的数据
//创建一个空的DatagramSocket对象,用于接收客户端发送的packet
DatagramPacket packet =
new
DatagramPacket(data,data.length);
//使用receive方法接收客户端发送的数据,这同样是一个阻塞的方法
socket.receive(packet);
//处理收到的数据包。因为每次不一定都是从开始存,所以从packet.getOffset()开始
String result =
new
String(packet.getData(),packet.getOffset(),packet.length());
System.out.println(result);
|
2.客户端:
1
2
3
4
5
6
7
8
9
|
//创建一个DatagramSocket对象
DatagramSocket socket =
new
DatagramSocket(
4567
);
//通过IP地址创建一个InetAddress对象
InetAddress serverAddress = InetAddress.getByName(
192.168
.
1.104
);
byte
[] data = “Hello”.getBytes();
//创建要发送的数据包,指定发送的数据、目标地址和端口号
DatagramPacket packet =
new
DatagramPacket(data,data.length,serverAddress,
4567
);
//调用socket的send方法发送数据
socket.send(packet);
|
4. Service初步
1.Service是什么?
Service是一个应用程序组件
Service没有图形化界面
Service通常用来处理一些耗时比较长的操作
可以使用Service更新ContentProvider,发送Intent一级启动系统的通知等等。
2.Service不是什么?
Service不是一个单独的进程
Service不是一个线程
如果想要启动一个新线程作为Service,那么需要在继承于Service类的OnStartCommand方法中指定线程。
3.启动Service:调用Context.startService();
停止Service:调用Context.stopService();
当第一次调用startService()的时候,调用Servie的onCreate方法,如果在调用startService(),则会调用Service的onStartCommand方法;当调用stopService()的时候,会调用Service的destroy方法。
4.Service需要在AndroidManifest.xml文件中声明(和Activity同级):
1
|
<
service
android:name=”.service.DownloadService”/>
|
注意:这个包名不全,是因为在AndroidManifest.xml中的根标签中定义了一个package,只要两部分合起来能够正确的描述类所在的路径即可。