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中进行处理呢?

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


目录
相关文章
|
7月前
|
架构师 网络协议 算法
Android高级架构师整理面试经历发现?(大厂面经+学习笔记(1)
Android高级架构师整理面试经历发现?(大厂面经+学习笔记(1)
|
7月前
|
消息中间件 缓存 架构师
2024年阿里Android高级面试题分享,附学习笔记+面试整理+进阶书籍
2024年阿里Android高级面试题分享,附学习笔记+面试整理+进阶书籍
|
缓存 安全 数据库
Android学习笔记4
Android学习笔记4
63 0
|
XML 数据库 数据安全/隐私保护
Android学习笔记3
Android学习笔记3
167 0
|
XML Java Android开发
Android学习笔记2
Android学习笔记2
77 0
|
XML Java Linux
Android学习笔记1
Android学习笔记1
61 0
|
存储 Java API
Android逆向 | 基础篇 - Java 学习笔记03
Android逆向 | 基础篇 - Java 学习笔记03
|
Java 编译器 Android开发
Android逆向 | 基础篇 - Java 学习笔记02
Android逆向 | 基础篇 - Java 学习笔记02
|
Java 编译器 Android开发
Android逆向 | 基础篇 - Java 学习笔记01
Android逆向 | 基础篇 - Java 学习笔记01
|
Java 开发工具 Android开发
Android中的Binder学习笔记
Android中的Binder学习笔记
Android中的Binder学习笔记