原生Android开发基础项目结构介绍
原生Android开发基础项目结构介绍
- 1.软件整体结构
- 2.具体的页面书写
- 3.实例分析
- 4.后续
下面先来总结一下软件的基本目录结构,这一般是开发的关键,只有明白了软件的目录结构,才能更加可灵活的设计软件。关注过我的人应该都知道,我主要是走的前端方向,然后摸一摸基础的后端,盘一盘网安,偶尔为自己的软件接口抓个包什么的。因此下面的介绍会通过与前端的对比来总结。
1.软件整体结构
(1)权限设置:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
最常规的比如上面的网络权限设置和文件读写权限等,具体需要的权限可以根据实际开发需要去查找就行;
(2)软件基本配置:
<applicationandroid:allowBackup="true"android:icon="@drawable/campus_notice"android:label="@string/app_name"android:networkSecurityConfig="@xml/network_security_config"android:requestLegacyExternalStorage="true"android:roundIcon="@drawable/campus_notice"android:supportsRtl="true"android:theme="@style/Theme.MqttLedMenu"></application>
解释:上面的@
引入的资源其实就在drawable
和values
目录下,
说明一下network_security_config
,因为Android默认只能使用https访问,但是由于项目调试以及部分接口不是安全协议,因此可能需要用到。具体内容如下(通过xml
引入),详细了解可以浏览(Android网络安全之NetworkSecurityConfig):
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android"><base-config cleartextTrafficPermitted="true" />
</network-security-config>
2.具体的页面书写
接下来以MainActivity
页面为例,注意这里的名字是默认的,也建议采用这个,类似于微信小程序里面的index
,不叫index
也可以,只是大家习惯这么命名
。
对于页面的XML文件的功能按钮做一下说明:
3.实例分析
以登录页面的为例,补充,写入了LoginActivity页面,要想在页面中具体使用,需要在AndroidManifest.xml
中做如下注册:
<activityandroid:name=".LoginActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!--intent-filter部分其实就表示默认展示页面-->
</activity>
分析如下:
<?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:background="@drawable/background"android:orientation="vertical"android:padding="30dp"tools:context=".LoginActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="160dp"android:orientation="vertical"><TextViewandroid:layout_width="60dp"android:layout_height="wrap_content"android:text="用户名:"android:textFontWeight="@integer/material_motion_duration_long_2" /><EditTextandroid:id="@+id/username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名~"android:textFontWeight="@integer/material_motion_duration_medium_1" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密码:"android:textFontWeight="@integer/material_motion_duration_long_2" /><EditTextandroid:id="@+id/password"android:layout_width="823dp"android:layout_height="wrap_content"android:hint="请输入登录密码~"android:password="true"<!--开启密码显示-->android:textFontWeight="@integer/material_motion_duration_medium_1"tools:ignore="Deprecated" /></LinearLayout><LinearLayout<!--emm,这里的布局被误调了,尴尬,不建议这么书写-->android:layout_width="800dp"android:layout_height="88dp"android:orientation="horizontal"><CheckBoxandroid:id="@+id/isRemember"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="记住密码"></CheckBox><TextViewandroid:id="@+id/isForget"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="40dp"android:text="忘记密码?" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="30dp"><Buttonandroid:id="@+id/login"android:layout_width="100dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn"android:padding="10dp"android:text="登录" /></LinearLayout></LinearLayout>
对应的逻辑代码如下:
package com.example.mqttledmenu;
//导入部分我给省了,如果报错就直接alt+enter导入就行
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {private EditText username;private EditText password;private CheckBox isRemember;private TextView isForget;private Button login;private SharedPreferences sp;//利用SharedPreferences存储用户密码实现自动登录功能@Overrideprotected void onCreate(Bundle savedInstanceState) {//初始化UI绑定,相当于html最原始的document的getElementByIdsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_login);username = findViewById(R.id.username);password = findViewById(R.id.password);login = findViewById(R.id.login);isRemember = findViewById(R.id.isRemember);isForget = findViewById(R.id.isForget);//绑定点击事件,这里因为implements(实现)了View.OnClickListener接口,因此//可以实现对绑定时间的集体封装,最后利用switch case便于统一管理点击事件。 login.setOnClickListener(this);isRemember.setOnClickListener(this);isForget.setOnClickListener(this);//检测密码信息sp = getSharedPreferences("config", Context.MODE_PRIVATE);Boolean autoLogin = sp.getBoolean("remember", false);if (autoLogin) {username.setText(sp.getString("username", ""));password.setText(sp.getString("password", ""));isRemember.setChecked(true);} else {isRemember.setChecked(false);}}//集中管理点击事件@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.login:String usernameStr = username.getText().toString();String passwordStr = password.getText().toString();if (usernameStr.equals("") || passwordStr.equals("")) {Toast.makeText(this, "用户名和密码不能为空!", Toast.LENGTH_SHORT).show();} else {//登录请求的逻辑,稍后新开一个文章详细解释,基础不好的先可以跳过Retrofit retrofit = new Retrofit.Builder().baseUrl(Config.serverUrl).build();UploadService uploadService = retrofit.create(UploadService.class);Call<ResponseBody> call = uploadService.login(usernameStr, passwordStr);call.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {String result = null;try {result = response.body().string();JsonObject returnData = new JsonParser().parse(result).getAsJsonObject();if (!returnData.get("code").toString().equals("200")) {Toast.makeText(LoginActivity.this, "用户名或密码错误~", Toast.LENGTH_SHORT).show();return;}JsonObject temp = new JsonParser().parse(returnData.get("data").toString()).getAsJsonObject();Config.getInstance().setUserId(temp.get("userId").toString());//存储用户的idConfig.getInstance().setUserAvatar(temp.get("userAvatar").toString());//存储用户的头像if (isRemember.isChecked()) {//存储用户用户名和密码SharedPreferences.Editor edit = sp.edit();edit.putString("username", usernameStr);edit.putString("password", passwordStr);edit.putBoolean("remember", true);edit.apply();}//页面跳转逻辑Intent intent = new Intent();//设置不能返回上一页,其实就是清空(clear)了页面栈intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);//第一个参数:当前页面(getApplicationContext能够自动获取当前页面)//第二个参数:想要跳转的页面intent.setClass(getApplicationContext(), MainActivity.class);startActivity(intent);} catch (IOException e) {Toast.makeText(LoginActivity.this, "服务端异常~", Toast.LENGTH_SHORT).show();e.printStackTrace();}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {}});}break;case R.id.isForget:Toast.makeText(this, "请联系辅导员重置密码哦!", Toast.LENGTH_SHORT).show();break;}}
}
4.后续
由于时间比较紧,可能写的相对粗糙,如果有什么不懂的可以在评论区提出来,我会根据时间尽快安排新的文章,喜欢的话可以点个赞支持一下呀!。
原生Android开发基础项目结构介绍相关推荐
- AngularJS+Ionic开发-2.项目结构介绍
使用上篇博客<开发环境搭建>中的命令创建完成IonicHelloWorld项目,在VSCode中的左侧,显示该项目的结构信息,如下图所示: 1 .sourcesmaps文件夹 调试状态的j ...
- .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI
作为后端开发的我来说,前端表示真心玩不转,你如果让我微调一个位置的样式的话还行,但是让我写一个很漂亮的后台的话,真心做不到,所以我一般会选择套用一些开源UI模板来进行系统UI的设计.那如何套用呢?今天 ...
- vue-cli构建SPA项目结构介绍spa完成路由开发及嵌套路由
目录 一.vue-cli构建SPA项目结构介绍 二.spa完成路由开发 三. 嵌套路由 一.vue-cli构建SPA项目结构介绍 前提:搭建好NodeJS环境 node -v npm -v ...
- 2017-2018-2 20165236 实验四《Android开发基础》实验报告
2017-2018-2 20165236 实验四<Android开发基础>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:郭金涛 ...
- 六十一、分析Springboot中的项目结构介绍
@Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 文章目录 spring项 ...
- 2018-2019-2-20175225 实验四《Android开发基础》实验报告
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:张元瑞 学号:20175225 指导教师:娄嘉鹏 实验日期:2019年5月14日 实验时间:13:45 - 21:00 实验序号:实验 ...
- 实验四android开发基础
实验四android开发基础 提交点一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd) ...
- 20175208 张家华 实验四《Android开发基础》实验报告
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:张家华 学号:20175208 指导教师:娄嘉鹏 实验日期:2019年5月16日 实验时 ...
- python在线投票系统讲解_Python开发基础-项目实训-在线投票系统ppt课件
<Python开发基础-项目实训-在线投票系统ppt课件>由会员分享,可在线阅读,更多相关<Python开发基础-项目实训-在线投票系统ppt课件(27页珍藏版)>请在人人文库 ...
最新文章
- springmvc常用注解标签详解
- 安装ssr_12月23日先锋首测启动,累计登录3天必得SSR!
- 【知识图谱系列】人工智能经典图谱有哪些?
- ASP.NET2.0中用ICallbackEventHandler实现客户端与服务器端异步交互
- JavaScript闭包的底层运行机制
- 2.5 Hive中外部表的讲解
- 简单了解RestTemplate消息读取的转化
- git merge用法_常用命令之git操作(进阶篇)
- 从0到上线一个完整Java项目,需要具备哪些技能?
- 重大调整!余承东兼任华为云与计算 BG 总裁
- JVM 排查问题实战
- String 创建对象问题
- STL 关联容器的lower_bound()和upper_bound()
- MIMO系统获取复用增益
- 深度学习之VGG19模型简介
- kitti数据集calib.txt文件
- AI识别彻底懵逼!这到底是「牛」还是「鲨」?
- 玩转NVIDIA Jetson AGX Xavier--- 中文用户手册
- 蚂蚁金服区块链朱永春:蚂蚁金服业务新思路,用以往通用场景结合出新的解决方案...
- 2021-12-23 网工基础(十四) 链路聚合的两种模式、堆叠、集群、IP路由基础