Android学习笔记(三)

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,只要两部分合起来能够正确的描述类所在的路径即可。


你可能感兴趣的:(android,笔记)