1、android studio
1-1、创建项目

//同一网络下真机调试,需安装以下插件

1-2、启动项目

//连接夜神模拟器 adb connect 127.0.0.1:62001
//将minSDKVersion 28改为22,然后点击右上角的Sync Now,最后点击绿色的箭头启动项目

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 //定义heightmatch_parent 继承父组件的width,heightwrap_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.开始加载图片:MainActivityUri 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.使用 MainActivityImageView 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@Overridepublic 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/MainActivityButton 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、新建活动

13-2、跳转(不传参)
//layout<Button android:id="@+id/main_btn" android:text="跳转到详情" android:layout_width="match_parent" android:layout_height="wrap_content" />
//java/MainActivityButton 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/MainActivityButton 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>
//MainActivitypublic 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);@Overridepublic void onClick(View v) { sendHttp();}private void sendHttp(){ new Thread(new Runnable() { @Override public void run() { Log.d("main","new Thread"); } }).start();}
@Overridepublic 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;@Overrideprotected 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、开启子线程发送http2、在ui线程中获取数据3、使用fastjson对数据进行解析4、创建实体类和接收数据映射5、获取数据
//1、引入依赖implementation 'com.alibaba:fastjson:1.1.71.android'
//java/AppDatapackage com.example.android_day02;//javabena 实体类,里面全部是属性,有get,setpublic 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; }}
//MainActivityprivate 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() 前台生存期