产品宣传册设计网站建设,来广营做网站公司,软件公司都是帮别人做网站么,精品资源共享课程网站建设说明
源代码在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP接上一篇: Android Studio — [学习笔记]Button、TextView、EditText 2.5 RadioButton
常用属性自定义样式监听事件
2.5.1 新建按钮,并跳转到相应的活动页面
1.…说明
源代码在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP接上一篇: Android Studio — [学习笔记]Button、TextView、EditText 2.5 RadioButton
常用属性自定义样式监听事件
2.5.1 新建按钮,并跳转到相应的活动页面
1.在com.skypan.textview下新建一个RadioButtonActivity活动 2.在主样式,新增一个 RadioButton按钮
Buttonandroid:idid/btn_radiobuttonandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textRadio Buttonandroid:textAllCapsfalse/3.在主活动中,添加按钮的跳转事件
public class MainActivity extends AppCompatActivity {// 声明按钮private Button mBtnRadioButton;overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBtnRadioButton (Button) findViewById(R.id.btn_radiobutton);mBtnRadioButton.setOnClickListener(new View.OnClickListener(){Overridepublic void onClick(View v) {// 跳转到 RadioButton 界面Intent intent new Intent(MainActivity.this, RadioButtonActivity.class);startActivity(intent);}})}
}2.5.2 封装View.OnClickListener
[说明] : 在主活动中,多次使用到这个方法,其中仅仅部分改变.因此将该方法提取出来. 1.提取出方法
private class OnClick implements View.OnClickListener{Overridepublic void onClick(View v) {Intent intent null;switch (v.getId()){case R.id.btn_textview:// 跳转到 TextView 演示界面intent new Intent(MainActivity.this, TextViewActivity.class);break;case R.id.btn_button:intent new Intent(MainActivity.this, ButtonActivity.class);break;case R.id.btn_edittext:intent new Intent(MainActivity.this, EditTextActivity.class);break;case R.id.btn_radiobutton:intent new Intent(MainActivity.this, RadioButtonActivity.class);break;}startActivity(intent);}
}2.设置启动函数
private void setListeners(){Onclick onclick new Onclick();mBtnTextView.setOnClickListener(onClick);mBtnButton.setOnClickListener(onClick);mBtnEditText.setOnClickListener(onClick);mBtnRadioButton.setOnClickListener(onClick);
}2.5.3 单选按钮的监听事件:
按钮组的布局如下:
RadioGroupandroid:idid/rg_1...
/RadioButtonandroid:idid/rb_1android:text男/RadioButtonandroid:idid/rb_2android:id女/
/RadioGroup监听函数如下:
public class RadioButtonActivity extends AppCompatActivity {private RadioGroup mRg1;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mRg1 (RadioGroup) findViewById(R.id.rg_1);mRg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {RadioButton radioButton (RadioButton) group.findViewById(checkedId);Toast.makeText(RadioButtonActivity.this, radioButton.getText(),Toast.LENGTH.SHORT).show();}})}
}[说明] : 1.一个活动对应的是一个类 2.所有活动都继承一个基类AppCompatActiviry 3.protected: 自己和子类都能使用. 4.private: 除了自己之外,其他类都无法使用
2.5.x 参数说明:
1.android:checked: 默认选中 2.android:state_checkedtrue: 点击时显示的样式 3.solid android:color#cc7a00: 一个矩形的颜色填充块 4.stroke android:width1dp: 1个单位宽度的矩形线 5.corners android:radius15dp: 矩形的边角曲率15个单位
[报错]: 1.Variable intent might not have been initialized: 变量intent没有初始化
2.6 复选框 CheckBox
常用属性自定义样式监听事件
2.6.1 线性垂直布局 复选框基本语法
LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalandroid:layout_belowid/cb_6android:layout_marginTop20dpTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textSize20spandroid:text你的兴趣:android:textColor#000/CheckBoxandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:idid/cb_7android:text编程android:textSize20spandroid:layout_marginTop5sp /CheckBoxandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:idid/cb_8android:text编程android:textSize20spandroid:layout_marginTop5sp//LinearLayout2.6.2 制作带图标的复选框
1.准备好2个图标 icon1 和 icon2 2.将2个图标放入res/drawable-xxhdpi 3.准备选择器: bg_check.xml
?xml version1.0 encodingutf-8?
selector xmlns:androidhttp://schemas.android.com/apk/res/androiditemandroid:state_checkedfalseandroid:drawabledrawable/icon_checkbox_false /itemandroid:state_checkedtrueandroid:drawabledrawable/icon_checkbox_true /
/selector[说明] :
(1)android:state_checkedfalse: 未选中(2)android:drawbledrawable/icon_checkbox_false: 使用icon_checkbox_false图标
4.在CheckBox中使用 Selector: bg_check.xml
CheckBox...android:buttondrawable/bg_check2.6.3 给复选框添加事件
1.假设复选框的id为 cb_1 和 cb_2 2.编写复选框的活动如下: CheckBoxActivity.java
public class CheckBoxActivity extends AppCompatActivity {// 声明控件private CheckBox mCb1, mCb2;overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 获取控件的视图mCb1 (CheckBox) findViewById(R.id.cb_1);mCb2 (CheckBox) findViewById(R.id.cb_2);mCb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Toast.makeText(CheckBoxActivity.this, isChecked? 1选中: 1取消, Toast.LENGTH_SHORT).show();}})mCb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Toast.makeText(CheckBoxActivity.this, isChecked? 2选中: 2取消, Toast.LENGTH_SHORT).show();}})}
}2.7 ImageView
Button的其他衍生控件: ToggleButton、Switch(略)常用属性加载网络图片
2.7.1 最基本的ImageView语法
activity_image_view.xml
ImageViewandroid:layout_width300dpandroid:layout_height200dpandroid:background#ff9900android:srcdrawable/bg_icon_manandroid:scaleTypefixXY/[说明] : 1.android:scaleTypefixXY: 撑满控件,宽高比可能发生变化 2.android:scaleTypefitCenter: 保持宽高比缩放,直到能完全显示 3.android:scaleTypecenterCrop: 保持宽高比缩放,直至完全覆盖控件,裁剪显示
2.7.2 使用ImageView加载一张网络图片
1.写好控件: activity_image_view.xml
ImageViewandroid:idid/iv_4android:layout_width200dpandroid:layout_height100dp/2.配置glide: /app/build.gradle
repositories {mavenCentral()google()
}
dependencies {implementation com.github.bumptech.glide:glide:4.10.0annotationProcessor com.github.bumptech.glide:compiler:4.10.0
}[说明] :
(1)使用glide进行网络资源请求(2)Android Studio编译器可以自动的按照 build.gradle 中的配置进行Jar包同步
3.获取控件iv_4,并使用glide往里面加资源
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.bumptech.glide.Glide;public class ImageViewActivity extends AppCompatActivity {private ImageView mIv4;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_view);mIv4 (ImageView) findViewById(R.id.iv_4);Glide.with(this).load(https://www.baidu.com/img/bd_logo1.png).into(mIv4);}
}
[报错] :
1)Request threw uncaught throwable java.lang.SecurityException: Permission denied (missing INTERNET permission?): 使用glide进行网络请求时,需要配置权限.在路径/app/src/main/AndroidMainfest.xml中添加网络权限如下:
use-permission android:nameandroid.permission.INTERNET /2.8 列表视图ListView(知道,被RecyclerView替代)
常用属性Adapter接口Demo演示
2.8.1 创建一个ListViewActivity(手动导入依赖)
1)在com.skypan.textview包下,新建一个包listview2)在listview下,新建一个Java类.注意: Name: ListViewActivity 和 Superclass: android.app.Activity3)创建视图: activity_listview.xml, 在路径 /app/src/main/res/layout4)完善ListViewActivity.java:
package com.skypan.textview.listview;
import android.app.Activity;
import andoird.os.Bundle;
import androidx.annotation.Nullable;
import com.skypan.textview.R;public class ListViewActivity extends Activity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);}
}5)将AndroidManifex.xml声明ListViewActivity.java
activity android:name.listview.ListViewActivity /2.8.2 自定义颜色 使用
1)在/app/src/main/res/values/colors.xml中写入自定义颜色,如下
resourcescolor namecolorGray#D5D5D5/color
/resources2)使用
TextViewandroid:textColorcolor/colorGrayDark /2.8.3 自定义List View 按压样式
1)新建一个选择器(Selector): /app/src/main/res/drawable - new Drawable Resource file - layout_list_item.xml2)list_item.xml
selector xmlns:androidhttp://schemas.android.com/apk/res/androiditem android:drawablecolor/colorAcecent android:state_pressedtrue /item android:drawablecolor/colorWhite android:state_pressedfalse /
/selector3)在List View中使用: activity_listview.xml
ListViewandroid:idid/lv_1android:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:listSelectordrawable/list_item /2.8.4 List View的点击事件
[参数]:
1)setOnItemClickListener: 点击事件2)setOnItemLongClickListener: 长按事件
import android.app.Activity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.ListViewpublic class ListViewActivity extends Activity {// 声明 ListView控件private ListView mLv1;Overrideprotected void onCrete(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);mLv1 (ListView) findViewById(R.id.lv_1);mLv1.setAdapter(new MyListAdapter(ListViewActivity.this));mLv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {Overridepublic void onItemClick(AdapterView? parent, View view, int position, long id) {Toast.makeText(ListViewActivity.this, text:点击了 position, Toast.LENGTH_SHORT).show();}});}
}[说明] :
1)公有类ListViewActivity继承安卓的app下面的公有类Activity2)ListView来自Android.widget.ListView3)适配器类MyListAdapter代码如下:/src/main/java/com.skypan.textview/listview/MyListAdapter.java
package com.skypan.textview.listview;import android.widget.BaseAdapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.View;
import android.view.ViewGroup;import com.bumptech.glide.Glide;
import com.skypan.textview.R;public class MyListAdapter extends BaseAdapter {private Context mContext;private LayoutInflater mLayoutInflater;public MyListAdapter(Context context) {this.mContext context;mLayoutInflater LayoutInflater.from(context);}Overridepublic int getCount() { return 10; }Overridepublic Object getItem(int position) { return null; }Overridepublic long getItemId(int position) { return 0; }static class ViewHolders {public ImageView imageView;public TextView tvTitle, tvTime, tvContent;}Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder null;if(convertView null) {convertView mLayoutInflater.inflate(R.layout.layout_list_item, null);holder new ViewHolder();holder.imageView (ImageView) convertView.findViewById(R.id.iv);holder.tvTitle (TextView) convertView.findViewById(R.id.tv_title);hodler.tvTime (TextView) convertView.findViewById(R.id.tv_time);hodler.tvContent (TextView) convertView.findViewById(R.id.tv_content);convertView.setTag(holder);} else {holder (ViewHolder) convertView.getTag();}// 给控件赋值holder.tvTitle.setText(这是标题);holder.tvTime.setText(2088-08-08);holder.tvContent.setText(这是内容呐~!);Glide.with(mContext).load(https://www.baidu.com/img/bd_logo1.png).into(holder.imageView);return convertView;}
}2.x TCP的三次握手与四次挥手
原址1)请画出三次握手和四次挥手的示意图(略)2)为什么连接的时候是三次握手? 参考
[try]: (1)TCP作为一种可靠传输控制协议,其核心思想是: 既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两种方法. (2)TCP可靠传输的精髓,TCP连接的一方A,由操作系统动态随机选取一个32位长的序列号(Initial Sequelize Number),假设A的初始序列号为1000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,1001,1002,1003…,并把自己的初始序号ISN告诉B,告诉B什么样编号的数据是合法的,什么编号的数据是非合法的,同时B还可以对A每一个编号的字节数据进行确认。如果A收到B的确认编号2001,则意味着字节编号1001~2000,共1000个字节已经安全到达 3)什么是半连接队列? [try]: 在TCP三次握手中的第一次握手,客户端向服务器发送SYN包,客户端将该连接保存在半连接队列中 4)ISN(Initial Sequence Number)是固定的吗? [try]: 不是固定的,随机ISN能避免非同一网络的攻击 5)三次握手过程可以携带数据吗? [try]: 根据RFC793标准,TCP的前2次握手不允许携带数据,但是第三次握手允许携带数据 6)如果第三次握手丢失了,客户端/服务端 会如何处理? 参考
[try]:
(1)Server端: 此时Server端的状态为SYN_RECV,并且会根据TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送 SYN ACK 包,以便Client重新发送ACK包.而Server重发SYN ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5.如果重发次数达到指定的次数仍未收到client的ACK应答,那么一段时间后,Server自动关闭这个连接.(2)Client端: Linux C中,client接收到 SYN ACK包之后,它的TCP状态就为established,表示该连接已经建立.如果第三次握手中的ACK包丢失的情况下,Client向Server端发送数据,Server端将以RST包响应,方能感知Server的错误.7)SYN攻击是什么? [try]: TCP连接建立时,只发送 SYN包, 而不发送 ACK包.8)挥手为什么需要四次? (后面解读)9)四次挥手释放连接时,等待2MSL的意义? (后面解读)
2.x.x TCP全连接/半连接队列 原址 1)什么是半连接队列,全连接队列? [a] Linux内核协议栈为一个tcp连接管理使用两个队列,一个是半连接队列(用来保存SYN_SEN和SYN_RECV状态的请求),一个是全连接队列(acceptd队列)(用来保存处于established状态,但是应用层没有调用accept取走的请求.) 2)TCP连接基本概念 三次握手 (1)第一次握手: 客户端发送syn包(syni)到服务器,并进入SYN_SEND状态,并等待服务器确认; (2)第二次握手: 服务器收到syn包,必须确认客户的SYN(ackj1), 同时也发送一个SYN包(synk), 即SYN ACK包, 此时服务器进入 SYN_RECV 状态. (3)第三次握手: 客户端收到服务器的 SYN ACK包,向服务器发送ACK(ackk1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手. 3)半连接队列(sync queue) 和 全连接队列(accept queue) (1)sync queue: 是服务器接收到客户端的第一次握手请求SYN后,将该连接加入到队列中,当收到客户端的ACK后,从列表中移出(2)accept queue: 是服务器收到客户端ACK后,将连接加入到的队列,在连接进行accept处理后,从队列中移出. 4)黑客攻击 - SYN洪水(SYN FLOOD) SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的SYN请求,而不回复ACK,占用大量服务器的半连接队列资源,进而导致队列溢出,无法响应正常的连接请求,耗费CPU和内存资源.