入门级带你实现一个安卓智能家居APP(1)java版本

这篇具有很好参考价值的文章主要介绍了入门级带你实现一个安卓智能家居APP(1)java版本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<?xml version="1.0" encoding="utf-8"?>

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

以上是比较重要的UI控件,大家了解一下,其他的一些属性我就不多说了,你们可以自己尝试修改一下参数,就会发现具体的对应的作用是什么了。

我们的ui已经做好了,现在就去写主活动类的逻辑代码!!!

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

我主要说说主要逻辑吧。

首先,当然是要把我们前面编写的界面都映射到我们的主活动,setContentView(R.layout.activity_main);//该activity映射的xml界面是activity_main.xml,就是这一句,然后,开启严苛模式,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。

接下来就是,初始化view组件 ` initView();//初始化显示的功能控件

最后对某些组件设置监听事件,以及编写对应的函数

重点来了


我们想要APP和单片机进行tcp通信,要怎么实现呢?

建立socket连接实现tcp/ip协议----这个就是我们的实现方式。

那应该怎么做

1.创建Socket(安卓作为客户端,所以是client,单片机作为server端)。

2.打开连接到Socket的输入/输出流。

3.按照协议对Socket进行读/写操作。

4.关闭输入输出流、关闭Socket。

也许说了你们可能还是不太懂,这个用代码怎么实现啊?

我先说明一下,java socket的实现和安卓平台socket的实现有一点点的区别,*在安卓里面,涉及到网络连接等耗时操作时,不能将其放在UI主线程中,需要添加子线程,在子线程进行网络连接,这就涉及到安卓线程间的通信了,用Handle来实现。这里的子线程也就是 mThreadClient。

下面直接看我的代码----MainActivity.java

package com.example.smarthome;

import androidx.annotation.RequiresApi;

import androidx.appcompat.app.AlertDialog;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;

import android.content.DialogInterface;

import android.os.Build;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.StrictMode;

import android.view.View;

import android.widget.Button;

import android.widget.CompoundButton;

import android.widget.EditText;

import android.widget.Switch;

import android.widget.TextView;

import android.widget.Toast;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetSocketAddress;

import java.net.Socket;

import java.net.SocketAddress;

/**

  • 建立socket连接实现tcp/ip协议的方式:

*1.创建Socket(安卓作为客户端,所以是client,单片机作为server端)

*2.打开连接到Socket的输入/输出流

*3.按照协议对Socket进行读/写操作

*4.关闭输入输出流、关闭Socket

*/

public class MainActivity extends AppCompatActivity {

private Button startButton;//连接按钮

private EditText IPText;//ip地址输入

private boolean isConnecting=false;//判断是否连接

private Thread mThreadClient=null;//子线程

private Socket mSocketClient=null;//socket实现tcp、ip协议,实现tcp server和tcp client的连接

private static PrintWriter mPrintWriterClient=null;//PrintWriter是java中很常见的一个类,该类可用来创建一个文件并向文本文件写入数据

private String res=“”;//接收的数据

private TextView warning_show, temp, mq;//警告语 温湿度 气体浓度

private String []send_order={“1\n”,“2\n”,“3\n”,“4\n”};//发送的指令 1开启通风 2 关闭通风 3开启抽湿 4关闭抽湿

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);//该activity映射的xml界面是activity_main.xml

strictMode();//严苛模式

initView();//初始化显示的功能组件

}

/**

  • 严苛模式

  • StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,

  • 以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,

  • 而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,

  • 我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。

*/

private void strictMode(){

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

.detectDiskReads()

.detectDiskWrites()

.detectNetwork()

.penaltyLog()

.build()

);

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects()

.penaltyLog()

.penaltyDeath()

.build());

}

/**

  • layout组件初始化

*/

private void initView(){

warning_show = findViewById(R.id.tv1);//警告语显示

temp = findViewById(R.id.temp_text);//温湿度显示

mq = findViewById(R.id.mq_text);//气体浓度显示

IPText= findViewById(R.id.IPText);//ip地址和端口号

IPText.setText(“192.168.1.127:8080”);//把ip地址和端口号设一个默认值,这个要改成你自己设置的

startButton= findViewById(R.id.StartConnect);//连接按钮

//连接事件 其实就是建立socket连接

startButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(isConnecting)

{

isConnecting=false;

if(mSocketClient!=null)

{

try{

mSocketClient.close();

mSocketClient = null;

if (mPrintWriterClient!=null){

mPrintWriterClient.close();

mPrintWriterClient = null;

}

mThreadClient.interrupt();

startButton.setText(“开始连接”);

IPText.setEnabled(true);//可以输入ip和端口号

warning_show.setText(“断开连接\n”);

} catch (IOException e) {

e.printStackTrace();

}

}

}else

{

mThreadClient = new Thread(mRunnable);

mThreadClient.start();

}

}

});

//通风开关按钮初始化

final Switch switch_c=findViewById(R.id.switch_c);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

switch_c.setShowText(true);//按钮上默认显示文字

}

switch_c.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if (isChecked)//当isChecked为true时,按钮就打开,并发送开的指令,当isChecked为false时,按钮就关闭,并发送关的指令

{

switch_c.setSwitchTextAppearance(MainActivity.this,R.style.s_true);//开关样式

switch_c.setShowText(true);//显示开关为on

if (send(send_order[0],-1)){

showDialog(“开启通风”);

}else{

switch_c.setChecked(false);//当APP没有连接到单片机时,默认此按钮点击无效

}

}else{

switch_c.setSwitchTextAppearance(MainActivity.this,R.style.s_false);//开关样式

switch_c.setShowText(true);//显示文字on

if (send(send_order[1],-1)){

showDialog(“关闭通风”);

}else{

switch_c.setChecked(false);//当APP没有连接到单片机时,默认此按钮点击无效

}

}

}

});

//抽湿开关按钮

final Switch switch_t=findViewById(R.id.switch_t);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

switch_t.setShowText(true);//按钮上默认显示文字

}

switch_t.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if (isChecked)

{

switch_t.setSwitchTextAppearance(MainActivity.this,R.style.s_true);//开关样式

switch_t.setShowText(true);//显示文字on

if (send(send_order[2],-1)){

showDialog(“开启抽湿”);

}else{

switch_t.setChecked(false);//当APP没有连接到单片机时,默认此按钮点击无效

}

}else{

switch_t.setSwitchTextAppearance(MainActivity.this,R.style.s_false);//开关样式

switch_t.setShowText(true);

if (send(send_order[3],-1)){

// flag=false;

showDialog(“关闭抽湿”);

}else{

switch_t.setChecked(false);//当APP没有连接到单片机时,默认此按钮点击无效

}

}

}

});

}

//开启子线程

private Runnable mRunnable = new Runnable() {

@Override

public void run() {

String msgText = IPText.getText().toString();

if(msgText.length()<=0)//IP和端口号不能为空

{

Message msg = new Message();

msg.what = 5;

mHandler.sendMessage(msg);

return;

}

int start = msgText.indexOf(“:”);//IP和端口号格式不正确

if((start==-1)||(start+1>=msgText.length()))

{

Message msg = new Message();

msg.what = 6;

mHandler.sendMessage(msg);

return;

}

String sIP= msgText.substring(0,start);

String sPort = msgText.substring(start+1);

int port = Integer.parseInt(sPort);

BufferedReader mBufferedReaderClient;//从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行

try

{

//连接服务器

mSocketClient = new Socket();//创建Socket

SocketAddress socAddress = new InetSocketAddress(sIP, port);//设置ip地址和端口号

mSocketClient.connect(socAddress, 2000);//设置超时时间为2秒

//取得输入、输出流

mBufferedReaderClient =new BufferedReader(new InputStreamReader(mSocketClient.getInputStream()));

mPrintWriterClient=new PrintWriter(mSocketClient.getOutputStream(),true);

//连接成功,把这个好消息告诉主线程,配合主线程进行更新UI。

Message msg = new Message();

msg.what = 1;

mHandler.sendMessage(msg);

}catch (Exception e) {

//如果连接不成功,也要把这个消息告诉主线程,配合主线程进行更新UI。

Message msg = new Message();

msg.what = 2;

mHandler.sendMessage(msg);

return;

}

char[] buffer = new char[256];

int count ;

while(true)

{

try

{

if((count = mBufferedReaderClient.read(buffer))>0)//当读取服务器发来的数据时

{

res = getInfoBuff(buffer,count)+“\n”;//接收到的内容格式转换成字符串

//当读取服务器发来的数据时,也把这个消息告诉主线程,配合主线程进行更新UI。

Message msg = new Message();

msg.what = 4;

mHandler.sendMessage(msg);

}

}catch (Exception e) {

// TODO: handle exception

//当读取服务器发来的数据错误时,也把这个消息告诉主线程,配合主线程进行更新UI。

Message msg = new Message();

msg.what = 3;

mHandler.sendMessage(msg);

}

}

}

};

/**

  • 在安卓里面,涉及到网络连接等耗时操作时,不能将其放在UI主线程中,

  • 需要添加子线程,在子线程进行网络连接,这就涉及到安卓线程间的通信了,

  • 用Handle来实现。这里的子线程也就是 mThreadClient

  • handle的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

  • 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) ,

  • 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button,

  • Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,

  • 例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,

  • 如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,

  • 会收到Android系统的一个错误提示 “强制关闭”. 这个时候我们需要把这些耗时的操作,

  • 放在一个子线程中,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,

  • Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),

  • 它与子线程可以通过Message对象来传递数据,这个时候,

  • Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,

  • 里面包含数据, 把这些消息放入主线程队列中,配合主线程进行更新UI。

*/

@SuppressLint(“HandlerLeak”)

Handler mHandler = new Handler()

{

@SuppressLint(“SetTextI18n”)

public void handleMessage(Message msg)

{

super.handleMessage(msg);

if(msg.what==4)//当读取到服务器发来的数据时,收到了子线程的消息,而且接收到的字符串我们给它定义的是res

{

char []arrs;

arrs=res.toCharArray();//接收来自服务器的字符串,把字符串转成字符数组

if (arrs.length>=3) {

if (arrs[0]==‘T’){//如果字符数组的首位是T,说明接收到的信息是温湿度 T25

temp.setText(“温湿度:”+arrs[1]+arrs[2]+“℃”);

}

else if (arrs[0]==‘M’){//如果字符数组的首位是T,说明接收到的信息是气体浓度M66

mq.setText(“气体浓度:”+arrs[1]+arrs[2]+“%”);

}

}else {

showDialog(“收到格式错误的数据:”+res);

}

}else if (msg.what==2){

showDialog(“连接失败,服务器走丢了”);

startButton.setText(“开始连接”);

}else if (msg.what==1){

showDialog(“连接成功!”);

warning_show.setText(“已连接智能衣柜\n”);

IPText.setEnabled(false);//锁定ip地址和端口号

isConnecting = true;

startButton.setText(“停止连接”);

}else if (msg.what==3){

warning_show.setText(“已断开连接\n”);

}else if (msg.what==5){

warning_show.setText(“IP和端口号不能为空\n”);

}

else if (msg.what==6){

warning_show.setText(“IP地址不合法\n”);

}

}

};

/**

  • 窗口提示

  • @param msg

*/

private void showDialog(String msg) {

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setIcon(android.R.drawable.ic_dialog_info);

builder.setTitle(msg);

builder.setCancelable(false);

builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

});

builder.create().show();

}

/**

  • 字符数组转字符串

  • @param buff

  • @param count

  • @return

*/

private String getInfoBuff(char[] buff,int count)

{

char[] temp = new char[count];

System.arraycopy(buff, 0, temp, 0, count);

return new String(temp);

}

/**

  • 发送函数

  • @param msg

  • @param position

  • @return

*/

private boolean send(String msg,int position){

if(isConnecting&&mSocketClient!=null){

if ((position==-1)){

try

{

mPrintWriterClient.print(msg);

mPrintWriterClient.flush();

return true;

}catch (Exception e) {

// TODO: handle exception

Toast.makeText(MainActivity.this, “发送异常”+e.getMessage(), Toast.LENGTH_SHORT).show();

}

}

}else{

showDialog(“您还没有连接衣柜呢!”);

}

return false;

}

}

这个时候,我们离成功就更近一步了。包名要和自己的包名一致啊。

接下来,看图

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

一定要加上这句话哦,不然的话,就联网不成功了。

都加上了吗???

style.xml 这个忘了给,现在补上,在res的value的文件夹里,不然会有部分代码报错哦

我们要准备测试啦!

注意啦,如果你的电脑是运行8G以上的,就可以用模拟器运行,如果是4G的,我建议用真机测试。


4G的看过来,教你怎么快速把APP安装到手机,不用USB连接。

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

这个就是跳出来的文件夹

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

安装好了吗?我们再等等8G的朋友~

8G的朋友们还在吗?来了来了


入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

你们一打开是这样的

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

然后就弄好模拟器啦

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

我的模拟器在开机,要等一等,等它开机完再运行。

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

这个是开机完的状态

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

要等它安装,我的安装好啦

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

测试了


怎么测试?直接拿单片机测试吗?

不是哦,我们可以通过网络调试助手进行测试。

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

需要的点网络调试助手

下载之后

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

然后确认你电脑的ip地址是什么?

win+R

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

ipv4地址就是你本机的地址。要和APP填写的一致。

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

测试开关按钮


入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

测试数据接收


入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

终于都弄好了!!!

累了累了…

后面要是自己加功能或者改功能怎么做?


我就随便讲几个例子,以后大家根据这些例子举一反三吧。

例1:如果我想增加一个文字显示,应该怎么做?

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

跟着我一起来动动手吧

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

这时候问题又来了,如果我想让它动态显示呢?就是当我点击了按钮它就换成别的文字?

这我们就得在主活动类对它进行绑定了,怎么绑定?

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

如果我们想要在成功连接了单片机之后,显示这个文字内容“已连接单片机”,我们就可以在对应的代码里增加代码textView.setText("已连接单片机");

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

然后我们运行一下APP

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

好啦,文字显示的就讲到这里了。

例2:如果我想增加一个按钮控件呢

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

它和文字显示的代码有什么区别呢?基本上是没有啥区别的,用法都差不多。

<Button

android:id=“@+id/button_test”

android:text=“按钮”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

只不过如果是按钮要多了个监听点击事件。绑定id的方式也是TextView差不多的哦。

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

那么。怎么给这个按钮添加监听事件呢?

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

button.setText(“真的变了耶”);

}

});

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

现在运行一下APP看看

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java
当然,我不是要你的按钮做这件事,你可以在监听事件的代码加上任何你想做的事。入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java
下一篇出kotlin版本的哦。
也许有小伙伴开始学的不是java版本的安卓,所以,主活动类可能代码看的会很吃力。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

更多Android高级工程师进阶学习资料

进阶学习视频
入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…文章来源地址https://www.toymoban.com/news/detail-859800.html

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

dlaXhpbl80MzQ0OTI0Ng==,size_16,color_FFFFFF,t_70)
下一篇出kotlin版本的哦。
也许有小伙伴开始学的不是java版本的安卓,所以,主活动类可能代码看的会很吃力。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-TLvp14EG-1712375421089)]

[外链图片转存中…(img-SWWN2fV8-1712375421090)]

[外链图片转存中…(img-o0PZwPrV-1712375421090)]

[外链图片转存中…(img-H4jQviRt-1712375421091)]

[外链图片转存中…(img-NWKELkfy-1712375421091)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

入门级带你实现一个安卓智能家居APP(1)java版本,程序员,android,智能家居,java

更多Android高级工程师进阶学习资料

进阶学习视频
[外链图片转存中…(img-IYYbexlM-1712375421091)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-ii1mwRjQ-1712375421091)]

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

到了这里,关于入门级带你实现一个安卓智能家居APP(1)java版本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 亲手打造一个本地LLM语音助手来管理智能家居

    经历过 Siri 和 Google 助手之后,我发现尽管它们能够控制各种设备,但却无法进行个性化定制,并且不可避免地依赖于云服务。出于对新知识的渴望以及想在生活中使用一些酷炫的东西,我下定决心,要追求更高的目标。 我的要求很简单: 我想要一个既幽默又带有讽刺意味的

    2024年01月21日
    浏览(34)
  • 基于STM32+ESP8266+FreeRTOS+安卓App上位机+MQTT连接OneNET的智能家居项目(软件开源篇附百度网盘链接)

      本篇文章主要是分享智能家居项目中的下位机STM32+FreeRTOS的代码部分。以下是项目最终的效果 stm32 esp8266 语音控制智能家居_哔哩哔哩_bilibili   另外附上main函数中的部分代码,完整代码会在文章末尾放上百度网盘链接,可以自行下载。 链接:https://pan.baidu.com/s/1IS-OMLy2_pyWyM

    2024年02月08日
    浏览(30)
  • 两个Mesh路由、一个5口交换机,打造智能家居无缝网络覆盖

    在现代家庭中,无线网络已经成为了必需品,每个人都希望享受到无缝连接的畅快体验。然而,由于信号覆盖范围的限制和信号干扰等问题,很多家庭在组网方面遇到了一些困难。 对于有需求的家庭而言,两个Mesh路由器是一种非常理想的解决方案。Mesh路由器系统是一种通过

    2024年01月19日
    浏览(62)
  • 记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

    其实发生段错误的情况有很多: 其实在项目的开发中最有可能的错误就是①和②,考虑到本项目数组用的比较少,所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱,声音也算是一种设备????? 有时候又没有段错误 怀疑是多线程的问题,把线程一个一个注释

    2024年04月15日
    浏览(24)
  • 【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别、安卓APP和PC端QT客户端远程操控)有视频功能展示

    目录 一、功能需求 二、开发环境 1、硬件: 2、软件: 3、引脚分配: 三、关键点 1、设计模式之工厂模式 2、线程 3、wiringPi库下的相关硬件操作函数调用 4、语音模块的串口通信 5、摄像头的实时监控和拍照功能 6、人脸识别 7、qt程序跨平台运行(编译成安卓APP) 四、编译和

    2024年02月15日
    浏览(44)
  • 【智能家居入门4】(FreeRTOS、MQTT服务器、MQTT协议、微信小程序)

    主控仍旧是STM32F103C8T6,实时操作系统选择的是FreeRTOS。 主要功能: ①环境信息采集并上传至微信小程序 ②微信小程序下发指令控制家电 ③由雨滴传感器和步进电机能够实现下雨自动收起衣服,停雨自动晒出衣服(由于驱动板和步进电机不在身边,这里代码中就用舵机来模拟

    2024年04月11日
    浏览(38)
  • 你相信光吗?开源一个能进行虚拟光渲交互的全志D1s智能家居中控

    本文所介绍产品demo是在立创开源平台的开源作品**《全志D1s智能家居中控虚拟光渲交互(86盒)》**,项目选用RISC-V核心的全志D1s作为主控进行开发,并通过家庭WIFI内网,实现设备间MQTT通信,与其它开源单片机控制项目进行充分联动, 旨在推广类似客制化键盘概念到智能家居领

    2024年02月02日
    浏览(28)
  • 【OrangePi Zero2 智能家居】智能家居项目的软件实现

    一、项目整体设计 二、项目代码的前期准备 三、实现语音监听接口 四、实现socket监听接口 五、实现烟雾报警监听接口 六、实现设备节点代码 七、实现接收消息处理接口 整体的软件框架大致如下: 整个项目开启4个监听线程, 分别是: 语音监听线程:用于监听语音指令,

    2024年02月22日
    浏览(41)
  • qt实现智能家居系统

    一、项目介绍           通过TCP/IP协议实现客户端和和服务端的链接,服务端和下位机通过串口通信的方式链接,传递信息,客户端通过账号登录进入进入智能家居服务系统,账号登录和QQ登录类似,我采用的是数据库的方式实现数据的存储和调用,界面使用qt-ui的方式进

    2024年02月11日
    浏览(33)
  • 基于树莓派实现 --- 智能家居

    演示视频链接:基于树莓派实现的智能家居_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1Tr421n7BM/?spm_id_from=333.999.0.0 ( PS:房屋模型的搭建是靠纸板箱和淘宝买的家居模型,户型参考了留学时短租的公寓~ )  到目前为止,对于linux的嵌入式软件开发,从底层到上层都有了一定的

    2024年04月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包