二十五、消息处理

前台服务8.0以上系统
25.1 配置权限

<!--配置前提服务权限--> 
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"></uses- permission> 

25.2 创建消息通知

//1.构建消息管理器 
NotificationManager manager= (NotificationManager) 
getSystemService(NOTIFICATION_SERVICE); 
//2.构建消息通道 
NotificationChannel channel=new 
NotificationChannel(ID,NAME,NotificationManager.IMPORTANCE_HIGH); 
//3.创建消息通道 
manager.createNotificationChannel(channel); 
//4.构建消息 
Notification notification=new Notification.Builder (this,ID) 
.setContentTitle ("收到一条重要通知") 
.setContentText ("这是重要通知") 
.setSmallIcon (R.mipmap.ic_launcher) 
.build (); 
//5.发送前台服务消息 
startForeground(1,notification);

25.3网络编程
25.3.1 HTTP协议简介
HTTP(Hyper Text Transfer Protocol)协议即超文本传输协议,它规定了浏览器和万维网服务器之间互相通信的规则。

25.3.2 一次HTTP请求的过程
建立连接→发送请求→处理请求→返回数据→发送请求2→关闭连接

25.3.3 HTTP请求的常用方式

  • GET
  • POST

25.3.4 HTTP请求的格式
请求行
请求头
请求体

25.3.5 HTTP响应的格式
响应行 (包含响应码:200 404 500 302)
响应头
响应体

25.4 数据提交方式
25.4.1 GET方式和POST方式提交数据
HTTP/1.1协议中共定义了八种方法来表明Request-URI指定的资源的不同操作方式。其中最常用的两种请求方式是GET和POST。

25.4.2 GET方式与POST方式的区别

  • GET方式以实体的方式得到由请求URL所指向的资源信息,向服务器提交的参数跟在请求URL后面。使用GET方式访问网络URL的长度是有限制的,请求URL的长度要小于1K。
  • POST方式用来向目的服务器发出请求,要求它接收被附在请求后的实体。它向服务器提交的参数在请求后的实体中,POST方式对URL的长度是没有限制的。

25.5 使用HttpConnection
25.5.1 URL : 包含请求地址的类

  • URL(path) : 包含请求路径的构造方法
  • openConnection() : 得到连接对象

25.5.2 HttpURLConnection : 代表与服务器连接的类
setRequestMethod(“GET/POST”) : 设置请求方式

  • setDoInput(true/false):设置可以读取服务器端返回的数据
  • setDoOutput(true/false):设置可以向服务器端写入数据
  • setConnectTimeout(time) : 设置连接超时时间, 单位为ms
  • setReadTimeout(time): 设置读取服务器返回数据的时间
  • connect() : 连接服务器
  • int getResponseCode(): 得到服务器返回的结果码
  • Int getContentLength() : 得到服务器返回数据的长度(字节)
  • getOutputStream() : 返回一个指向服务器端的数据输出流
  • getInputStream() : 返回一个从服务器端返回的数据输入流
  • disconnect() : 断开连接

25.5.3 HttpURLConnection的基本用法
在实际开发中,绝大多数的App都需要与服务器进行数据交互,此时就需要用到HttpURLConnection,它是一个标准的Java类。

URL url = new URL(“http://www.itcast.cn”);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
try{
//读取流信息,获得服务器返回的数据
}catch(Exception e){
}
conn.disconnect();

注意:使用HttpURLConnection对象访问网络时,需要设置超时时间,如果不设置超时时间,在网络异常的情况下,会取不到数据而一直等待导致程序僵持不往下执行

25.6 网络请求要使用子线程

<?xml version="1.0" encoding="utf-8"?> 
<network-security-config> 
<domain-config> 
<domain includeSubdomains="true">https://www.baidu.com/</domain> 
<pin-set expiration="2020-08-01"> <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y= 
</pin> 
<!-- backup pin --> 
<pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE= 
</pin> 
</pin-set> 
</domain-config> 
</network-security-config>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission 
android:name="android.permission.ACCESS_NETWORK_STATE"/> 
android:usesCleartextTraffic="true" 
android:networkSecurityConfig="@xml/network_security_config"
new Thread(new Runnable() { 
@Override
 public void run() { 
 try{
 //1.构建请求地址 
 URL url=new URL("https://www.baidu.com/"); 
 //2.获取HttpUriConnection对象 
 HttpURLConnection connection= (HttpURLConnection) url.openConnection(); 
 //3.设置请求信息 
 /** json 数据传递
  * connection.setRequestMethod("GET");
  * connection.setDoOutput(true);  
  * connection.setDoInput(true); 
  * connection.setUseCaches(false); 
  * String data= (unmae=admin) + (passs=123);要求数据格式 
  * OutputStream out=connection.getOutputStream();
  * out.write(data);
   */ 
   connection.setConnectTimeout(50000); 
//connection.setRequestProperty("charset","utf-8"); 
//连接 
connection.connect(); 
//4.获取响应 
if(connection.getResponseCode()==200){ 
//5.处理响应内容 
InputStream in=connection.getInputStream();
InputStreamReader isr=new InputStreamReader(in,"utf-8"); 
BufferedReader reader=new BufferedReader(isr); 
String line; 
while((line=reader.readLine())!=null){ 
System.out.println(line); 
}
reader.close(); 
isr.close(); 
in.close();
 } 
 }catch (Exception e){
  e.printStackTrace(); 
  } 
  }
   }).start(); 

25.7 Handler消息机制
1)在使用手机下载软件时,通常都能在界面上看到一个下载的进度条,这个进度条用来表示当前下载的进度。但是Android4.0以后不能在UI线程访问网络,而子线程也不能更新UI界面。为了根据下载进度实时更新UI界面,就需要用到Handler消息机制来实现线程间的通信。
2)Handler机制主要包括四个关键对象,分别是:Message、Handler、MessageQueue、Looper。
3)Handler主要用于发送消息和处理消息。一般使用Handelr对象的sendMessage()方法发送消息,消息经过一系列处理后,最终会传递到Handler的handlerMessage()方法中。

  • 发送即时消息: sendMessage(Message msg)
  • 发送延时消息: sendMessageDelayed(Message msg, long time)
  • 处理消息: handleMessage(Message msg) (回调方法)
  • 移除还未处理的消息: removeMessages(int what)

MessageQueue
MessageQueue是消息队列的意思,它主要用来存放通过Handler发送的消息。通过Handler发送的消息会存在MessageQueue中等待处理。它是一个按Message的when排序的优先级队列。(when:代表着被处理的时间)
Looper
Looper是每个线程中的MessageQueue的管家。调用Looper的loop()方法后,就会进入到一个无线循环中。然后一发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的HandlerMessage()方法中。

25.7.1 使用Handler的一般步骤
①创建Handler成员变量对象, 并重写其handleMessage()
②在分/主线程创建Message对象
③使用handler对象发送Message
④在handleMessage()中处理消息

Handler消息处理首先需要在UI线程创建一个Handler对象,然后在子线程中调用Hanlder的sendMessage()方法,接着这个消息会存放在UI线程的MessageQueue中,通过Looper对象取出MessageQueue中的消息,最后分发回Hanlder的handleMessage()方法中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值