前台服务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()方法中。