1、android studio
1-1、创建项目
![1.png](/uploads/projects/mengyinli@fesi7h/8f52ed1835155733077cfa58553f6ef5.png)
//同一网络下真机调试,需安装以下插件
![2.png](/uploads/projects/mengyinli@fesi7h/e2190ea89321adb3a50a006351d9e174.png)
1-2、启动项目
![q.png](/uploads/projects/mengyinli@fesi7h/f4da5b4ee25311f9f153834e12661df4.png)
//连接夜神模拟器
adb connect 127.0.0.1:62001
//将minSDKVersion 28改为22,然后点击右上角的Sync Now,最后点击绿色的箭头启动项目
![q.png](/uploads/projects/mengyinli@fesi7h/ca0e675a4191d3471b714c8b0f890ce8.png)
2、项目结构
app-res-layout activity_main.xml //视图层
app-java MainActivity.java //逻辑控制层 activity活动 vue-组件
AndroidManifest.xml //将活动注册在这个文件中
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//category包含了一个活动的附加的一些信息,是可以自定义。它精确了指明了当前活动能够响应的Intent
3、布局
//layout/.xml
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="按钮"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
android:layout_width //定义width
android:layout_height //定义height
match_parent 继承父组件的width,height
wrap_content 组件实际的大小
4、简单的点击事件
//1.main_activity
<Button
android:id="@+id/main_btn"
android:text="按钮"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
//2.MainActivity
Button btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"android牛逼",Toast.LENGTH_SHORT).show();
}
});
5、Intent
Intent:是Android程序进行用户交互的一种方式。它不仅可以指明当前组件想要执行的动作,还可以在不同的组件之间传递数据。
1.启动活动
2.启动服务
3.发送广播
5-1、打电话
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
5-2、开启一个网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
6、修改app的图标和名称
//res/drawable //ctrl+鼠标左键
android:icon="@drawable/logo"
android:label="@string/app_name"
7、控件
//ImageView 只能加载本地图片
<ImageView
android:src="@drawable/logo"
android:layout_width="200dp"
android:layout_height="200dp" />
8、Freso加载网络图片
引入和使用Freso
//引入依赖
implementation 'com.facebook.fresco:fresco:2.0.0'
//2.配置 AndroidManifest.xml
//用户权限
<uses-permission android:name="android.permission.INTERNET"/> //允许进行网络请求
//3.MainActivity.java
Fresco.initialize(this); //配置到setContentView前面
setContentView(R.layout.activity_main);
//4.xml布局文件中, 加入命名空间:
<!-- 其他元素-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
//5.SimpleDraweeView: layout
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/logo"
/>
//6.开始加载图片:MainActivity
Uri uri = Uri.parse("xxx");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);
alt+enter自动导包
9、Picasso加载网络图片
引入依赖
//1.引入依赖 //build.gradle(module:app)
implementation 'com.squareup.picasso:picasso:2.71828'
加载图片
//layout
<ImageView
android:id="@+id/ImageView"
android:layout_width="50dp"
android:layout_height="50dp" />
//2.使用 MainActivity
ImageView imageView = (ImageView) findViewById(R.id.ImageView);
Picasso.get().load("xxx").into(imageView);
10、添加Menu
//1.res下新建一个menu文件夹
//2.menu下新建New-Menu resource file,文件名就叫main
/menu/main.xml
<item
android:icon="@drawable/sao"
android:id="@+id/sao"
android:title="扫一扫" />
<item
android:icon="@drawable/add"
android:id="@+id/add"
android:title="添加好友"/>
//3.MainActivity配置
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return super.onCreateOptionsMenu(menu);
}
//4.给Menu下的item设置事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.sao:
Toast.makeText(MainActivity.this,"扫一扫",Toast.LENGTH_SHORT).show();
break;
case R.id.add:
Toast.makeText(MainActivity.this,"添加朋友",Toast.LENGTH_SHORT).show();
default:
}
return true;
}
11、finish()
使用finish()可以销毁一个活动
//java/MainActivity
@Override
public void onClick(View v) {
finish();
}
12、打印日志
Log.d("main","hello world");
//layout
<Button
android:id="@+id/main_btn"
android:text="打印日志"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
//java/MainActivity
Button btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d("main","hello world");
}
});
//LogCat控制台看打印数据
13、页面跳转
13-1、新建活动
![activity.png](/uploads/projects/mengyinli@fesi7h/d60c76ba9bc399bcc7b66082064cbaa1.png)
13-2、跳转(不传参)
//layout
<Button
android:id="@+id/main_btn"
android:text="跳转到详情"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
//java/MainActivity
Button btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,DetailActivity.class);
startActivity(intent);
}
});
13-3、跳转传值
//java/MainActivity
Button btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String id="1001";
Intent intent = new Intent(MainActivity.this,DetailActivity.class);
intent.putExtra("id",id);
startActivity(intent);
}
});
//跳转页面接收值 getIntent和getStringExtra
//java/DetailActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
//+++
Intent intent = getIntent();
String data = intent.getStringExtra("id");
Log.d("id",data);
}
14、进程和线程
进程:在计算机上运行的一个应用程序就是一个进程。
线程:线程时进程的基本单位。一个进程由一个或者多个线程组成。线程和线程之间是独立的。
进程和线程在使用内存的区别:
1.操作系统会给进程分配独立的内存空间
2.多个线程共享内存空间
15、给多个按钮执行点击事件
//layout
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="发送http"
android:id="@+id/send_http"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:text="btn2"
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
//MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.send_http);
Button btn2 = (Button) findViewById(R.id.btn2);
btn.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.send_http:
Log.d("main","send_http");
break;
case R.id.btn2:
Log.d("main","btn2");
break;
}
}
}
16、okHttp(发送http请求)
implementation("com.squareup.okhttp3:okhttp:4.3.0")
Button btn = (Button) findViewById(R.id.send_http);
btn.setOnClickListener(this);
@Override
public void onClick(View v) {
sendHttp();
}
private void sendHttp(){
new Thread(new Runnable() {
@Override
public void run() {
Log.d("main","new Thread");
}
}).start();
}
@Override
public void onClick(View v) {
responseTxt.setText("hello world");
sendHttp();
}
private void sendHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://music.aityp.com/").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
Log.d("http",responseData);
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
17、改变TextView的值
//点击按钮改变TextView的值
<TextView
android:id="@+id/response_txt"
android:text="hello"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
+++TextView responseTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.send_http);
+++responseTxt = (TextView)findViewById(R.id.response_txt);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
+++responseTxt.setText("hello world");
}
}
改变TextView中的json数据
不允许在子线程中操作UI
TextView responsetTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.send_http);
+++responsetTxt = (TextView)findViewById(R.id.response_txt);
btn.setOnClickListener(this);
}
private void sendHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://music.aityp.com/").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
+++showResponse(responseData);
Log.d("http",responseData);
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
private void showResponse(final String res){
// android不允许在子线程中操作UI,可以通过runOnUiThread方法,
runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject obj = JSON.parseObject(res);
responsetTxt.setText(res);
}
});
}
1、开启子线程发送http
2、在ui线程中获取数据
3、使用fastjson对数据进行解析
4、创建实体类和接收数据映射
5、获取数据
//1、引入依赖
implementation 'com.alibaba:fastjson:1.1.71.android'
//java/AppData
package com.example.android_day02;
//javabena 实体类,里面全部是属性,有get,set
public class AppData {
private String msg;
private int code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
private void setCode(int code){
this.code = code;
}
}
//MainActivity
private void showResponse(final String res){
// android不允许在子线程中操作UI,可以通过runOnUiThread方法,
runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject obj = JSON.parseObject(res);
AppData data = JSON.toJavaObject(obj,AppData.class);
responsetTxt.setText(data.getMsg());
}
});
}
19、生命周期
- onCreate 活动第一创建的时候会调用
- onStart 活动由不可见到可见的时候会触发
- onResume 活动处于栈的顶部会触发
- onPause 活动处于暂停状态的时候会触发
- onStop() 活动不可见的时候会触发
- onDestroy() 活动会触发
- onRestart() 窗口重新被启动的时候会触发
//页面初次加载以下生命周期函数触发:
onCreate()
onStart()
onResume()
//A页面跳转以下生命周期函数触发:
onPause()
onStop()
//跳回到A以下生命周期函数触发:
onRestart()
onStart()
onResume()
//退出程序以下生命周期函数触发:
onPause()
onStop()
onDestroy()
//生命周期函数的映射
onCreate() onDestroy() 完整生存期
onStart() Stop() 可见生存期
onResume() onPause() 前台生存期