后端工程师入门安卓开发笔记(一)

简介: 我是daxia,一个做了8年多的后端开发,对前端一直仅限于Web页面开发,对移动端开发和小程序开发基本零基础;有时候想做一些有意思的东西出来,用网页实现对手机支持现在是不理想,忙里偷闲学了学安卓,把一些我觉得是重点内容做一个笔记,也希望笔记对其他人有所帮助。

## 背景摘要


我是daxia,一个做了8年多的后端开发,对前端一直仅限于Web页面开发,对移动端开发和小程序开发基本零基础;


有时候想做一些有意思的东西出来,用网页实现对手机支持现在是不理想,忙里偷闲学了学安卓,把一些我觉得是重点内容做一个笔记,也希望笔记对其他人有所帮助。



## 一、开发步骤


先写好界面->再写Activity的逻辑,界面别管样式,只关心你需要的交互元素就行。



布局示例代码,一般用LinearLayout布局,LinearLayout布局有竖向布局和横向布局,main.xml文件里一定要有`android:orientation="vertical"`这行代码


```xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:orientation="vertical"

   tools:context=".MainActivity"

   >


   <EditText

       android:id="@+id/login_input_username"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:hint="请输入你的用户名" />


</LinearLayout>

```


## 二、点击事件


1. 引入监听事件的包

2. 需要xml里面的button按钮设置一个ID

3. 在控制器 找到ID,设置一个监听事件

4. 然后实现 `onClick`方法


```java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


   private Button login_btn_submit;

 

       @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

     

       //找到对应元素

       login_btn_submit = findViewById(R.id.login_btn_submit);

       //设置监听事件

       login_btn_submit.setOnClickListener(this);

   }

 

   @Override

   public void onClick(View view) {

       int id = view.getId();

       if (id == R.id.login_btn_submit) {

           userLogin();

       }

   }

```


## 三、Activity 之间跳转和数据传递


### 3.1 跳转页面


先获取值内容,然后使用Intent进行跳转,具体看示例代码


```java

   //执行用户登录

   protected void userLogin() {


       Intent intent = new Intent();

       intent.putExtra("username", login_input_username.getText());

       intent.putExtra("password", login_input_password.getText());

       intent.setClass(MainActivity.this, UserList.class);

       startActivity(intent);

   }


```


### 3.2 接收数据


B页面接收数据


```java

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_user_list);

       try {

           Intent intent = getIntent();

           userId = intent.getExtras().getString("user_id");

           Log.i(getLocalClassName(), "22222____" + userId);

       } catch (NullPointerException e) {

           Toast.makeText(this, "user_id is null", Toast.LENGTH_LONG).show();

       }


       initView();

   }

```


## 四、列表页面布局


### 4.1 新建子页面


新建一个xml,用于每一行的布局



```xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="match_parent">


   <TextView

       android:id="@+id/user_item_name"

       android:layout_width="150dp"

       android:layout_height="50dp"

       android:text="11" />


   <TextView

       android:id="@+id/user_item_age"

       android:layout_width="150dp"

       android:layout_height="50dp"

       android:text="11" />


   <ImageView

       android:id="@+id/user_item_pic"

       android:layout_width="wrap_content"

       android:layout_height="50dp"

       android:layout_weight="1"

       android:src="@mipmap/touxiang" />


</LinearLayout>

```


### 4.2 准备数据


新建一个数据结构对象,确定数据格式



定义了三个变量,可以用编辑器的生成功能自动生成对应访问方法

```

package site.qingscan.qingting;


import java.io.Serializable;


public class Account implements Serializable {


   private String name;

   private int age;

   private int pic;

}

```




### 4.3 数据适配


新建一个适配器


将页面和数据进行渲染

```java

package site.qingscan.qingting;


import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.TextView;


import java.util.List;


public class UserListAdapter extends BaseAdapter {

   private List<Account> userList;

   private Context context;


   public UserListAdapter(List<Account> userList,Context context) {

       this.userList = userList;

       this.context = context;

   }


   @Override

   public int getCount() {

       return userList.size();

   }


   @Override

   public Object getItem(int i) {

       return userList.get(i);

   }


   @Override

   public long getItemId(int i) {

       return i;

   }


   @Override

   public View getView(int i, View view, ViewGroup viewGroup) {

       //找到页面

       LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.user_list_item, null);

       //找到对应元素

       TextView user_item_name = (TextView) layout.findViewById(R.id.user_item_name);

       TextView user_item_age = (TextView) layout.findViewById(R.id.user_item_age);

       ImageView user_item_pic = layout.findViewById(R.id.user_item_pic);

       //给元素赋值

       user_item_name.setText(userList.get(i).getName());

       user_item_age.setText(Integer.toString(userList.get(i).getAge()));

       user_item_pic.setImageResource(userList.get(i).getPic());

       //返回对象

       return layout;

   }

}


```



### 4.4 组合调用


在activity中调用


```java

   private void initView() {

       user_list = findViewById(R.id.userlist_list);

       ArrayList<Account> users = new ArrayList<>();


       for (int i = 0; i < 5; i++) {

           Account tempObj = new Account();

           tempObj.setName("tqs" + Integer.toString(i));

           tempObj.setAge(25 + i);

           tempObj.setPic(R.mipmap.touxiang);

           users.add(tempObj);

       }


       user_list.setAdapter(new UserListAdapter(users,this));


   }

```



## 五、网络请求


### 5.1 POST请求


先定义一个HTTP发包的函数,代码如下所示


```java

  public String httpLoginRequest(String username, String psd) {

       String msg = "";    //服务器返回结果

       try {

           URL url = new URL(loginUrlZhuCe);

           HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

           httpURLConnection.setConnectTimeout(5000);

           httpURLConnection.setRequestMethod("POST");

           httpURLConnection.setRequestProperty("Charset", "UTF-8");

           httpURLConnection.connect();

           //post请求传递参数

           String data = "uname=" + username + "&psd=" + psd;   //参数之间用&连接

           //向服务器发送数据(输出流)

           BufferedWriter writer = new BufferedWriter(

                   new OutputStreamWriter(httpURLConnection.getOutputStream(), "UTF-8"));

           writer.write(data);

           writer.close();


           //接受服务器反馈信息

           int code = httpURLConnection.getResponseCode();  //获得服务器反馈信息

           Log.d("login", "" + code);

           if (code == HttpURLConnection.HTTP_OK) {

               //接收服务器返回信息(输入流)

               BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));

               String line = "";

               //使用循环来获得数据,一次一行

               while ((line = reader.readLine()) != null) {

                   msg += line;

               }

               Log.d("login", "msg:" + msg);

               reader.close();  //关闭

           }

       } catch (IOException e) {

           e.printStackTrace();

       }

       return msg;

   } //end login


```


### 5.2 子线程调用


网络请求不能放到主线程里执行,需要新建一个线程


```java

   protected void userLogin() {


       new Thread(new Runnable() {

           public void run() {

               httpLoginRequest("dddd", "bbb");

           }

       }).start();

     

   }

```


需要注意,访问网络需要加权限


在`AndroidManifest.xml`文件的`<manifest>`标签里加


```

   <uses-permission android:name="android.permission.INTERNET" />

```



----


作者:汤青松


日期: 2022年06月28日

目录
相关文章
|
17天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
44 4
|
20天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
42 19
|
8天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
37 3
|
21天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
46 14
|
22天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
31 5
|
20天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
22天前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
22天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
21天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
21天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
33 1