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中进行处理呢?
//通过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:
WifiManager wifiManager = (WifiManager)Context.getSystemService(Service.WIFI_SERVICE);
操作WIFI网卡:
wifiManager.setWifiEnabled(true);// 打开WIFI wifiManager.setWifiEnabled(false);//关闭WIFI wifiManager.getWifiState();//获取WIFI的当前状态
3. Socket编程
基于TCP协议的Socket编程:不多说。
基于UDP协议的Socket编程:
1.服务端:
//创建一个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.客户端:
//创建一个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同级):
<service android:name=”.service.DownloadService”/>
注意:这个包名不全,是因为在AndroidManifest.xml中的根标签中定义了一个package,只要两部分合起来能够正确的描述类所在的路径即可。