提笔风雅 發表於 2024-8-27 11:38:00

Android开发

<p>开发工具Android Studio软件</p>
<p>官网地址:https://developer.android.google.cn/studio</p>
<p><span style="font-size: 16px"># 项目构建工具介绍</span><br>Gradle和Maven都是Java项目的构建工具,但它们有一些区别:<br>1. 语法:Gradle使用Groovy语言进行编写,而Maven使用XML。Groovy更加灵活易读,XML更加严谨易于重用。<br>2. 性能:Gradle比Maven更加高效快速,因为它使用了增量构建模式,只会重新构建被更改的模块,而Maven则需要重新构建整个项目。<br>3. 插件:Gradle的插件生态更加丰富和现代化,而Maven的插件相对较为传统。此外,Gradle的插件可以非常容易地编写和定制,而Maven的插件相对繁琐。<br>4. 维护:Maven有比较成熟的工具链和文档支持,而Gradle则相对较新,可能需要更多的自学</p>
<p><span style="font-size: 16px"># Groovy介绍</span><br>Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码</p>
<p><br><span style="font-size: 16px">开发流程:</span><br>安卓开发 = Java代码处理业务逻辑 + xml页面布局</p>
<p>&nbsp;</p>
<p><span style="font-size: 16px">[安装]</span><br>注意: 中间需要选择是否安装虚拟机(可以选择安装也可以不安装),如果使用真机调试,就不需要安卓虚拟机</p>
<p><br><span style="font-size: 16px">[配置]</span><br>打开软件<br>可以选择自定义安装选择SDK的目录, 也可以常规安装让其自行选择一个目录</p>
<p>默认SDK路径:<br>例如:C:\Users\ML\AppData\Local\Android\Sdk</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">1) 不用设置代理
2) license Agreement 中对于每个都需要单独点选Accept, 最后再进行Finish
正常他会下载相关的组件并安装, 都完成之后,就正常打开软件
SDK管理配置:
More Actions &gt; SDK Manager

File &gt; Settings &gt; Android SDK
SDK Platforms:
a)安装Android API 35
b)安装Android 11.0 (根据自己手机的系统版本选择即可)

SDK Tools:

3) emulator和paltform-tools目录加入到环境变量
</pre>
</div>
<p>  </p>
<p><span style="font-size: 16px">[使用]</span></p>
<p>新建)<br>   &gt; 选择"Phone and Tablet" &gt; Empty Views Activity 空视图页<br>填写 项目名 + 包名 + 项目位置 + 编辑语言(要选Java) + SDK版本(支持的最小的安装版本,可以选择10以上)<br>正常情况下会下载依赖包并安装完成了</p>
<p>真机运行)<br>前提: 手机开启开发者模式 &amp; 允许USB调试,并且用数据线和电脑连接</p>
<p>目录结构说明:<br>安卓视图) </p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">app
|-- manifests
|-- | -- AndroidManifest.xml (项目名称,图标,启动,权限配置等)
|-- java
|-- | -- com.lanlang.androiddemo (每个页面中的处理逻辑)
|-- | -- | -- MainActivity
...
|-- res (资源)
|-- | -- drawable
|-- | -- layout
|-- | -- | -- activity_main.xml (xml页面)
|-- | -- mipmap
|-- | -- values
|-- | -- xml (项目配置)

Gradle Scripts: gradle的一些配置
</pre>
</div>
<p>  </p>
<p><br>项目视图)</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">AndroidDemo
├── .gradle #AndroidStudio 自动生成的文件,会自动修改它的,项目打包时也会删除;
├── .idea # AndroidStudio自动生成的文件,会自动修改它的,项目打包时也会删除;
├── app # 应用相关的东西都在里面,工作的核心目录
│ ├── build # 编译的产物。某些情况下,可以手动把它整个删掉。
│ ├── libs # 依赖包可以放这里,比如一些jar文件。
│ ├── src # 代码在这。非常重要。
│ │ ├── main
│ │ │ ├── java # 放Java代码的地方
│ │ │ ├── res
│ │ │ │ ├── drawable # 应用图标
│ │ │ │ ├── layout # Android布局文件夹
│ │ │ │ ├── mipmap # 适配不同分辨率的手机
│ │ │ │ ├── mipmap # 桌面图标
│ │ │ │ └── values # 颜色、样式、字符集配置文件夹
│ │ │ ├──AndroidManifest.xml#APP运行配置文件,用来配置权限:程序入口配置、应用程序主题、应用程序组件等
│ ├── .gitignore # 版本控制
│ ├── build.gradle # 非常重要,app的构建配置。俗称“app的gradle文件”。
│ └── proguard-rules.pro # 不管。这个是混淆配置。
├── gradle # 它是一个构建起配置文件
├── .gitignore # 整个工程的版本控制
├── build.gradle # 很重要。项目级的配置。俗称“项目gradle文件”
├── gradle.properties # 全局的gradle配置文件
├── gradlew # Linux/mac上执行gradle命令
├── gradlew.bat # Windows上执行gradle命令
├── local.properties # 本地配置文件,一般不上传
└── settings.gradle # gralde的项目级配置
</pre>
</div>
<p>  </p>
<p>开发</p>
<p>&nbsp;支持okhttp3:</p>
<div class="cnblogs_code">
<pre>在app &gt;<span style="color: rgba(0, 0, 0, 1)"> build.gradle文件中dependencies下添加依赖

implementation </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.squareup.okhttp3:okhttp:4.9.1</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>&nbsp;</p>
<p>基本使用:</p>
<div class="cnblogs_code">
<pre>//<span style="color: rgba(0, 0, 0, 1)"> 构造请求
val okHttpClient </span>=<span style="color: rgba(0, 0, 0, 1)"> OkHttpClient()
val request </span>= Request.Builder().url(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://localhost:8080/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).build()
val call </span>=<span style="color: rgba(0, 0, 0, 1)"> okHttpClient.newCall(request)
</span>//<span style="color: rgba(0, 0, 0, 1)"> 发起调用
val execute </span>=<span style="color: rgba(0, 0, 0, 1)"> call.execute()
println(execute)</span></pre>
</div>
<p>添加拦截器:</p>
<div class="cnblogs_code">
<pre>OkHttpClient httpClient =<span style="color: rgba(0, 0, 0, 1)"> new OkHttpClient.Builder()
.addInterceptor(new RetryInterceptor(</span>3<span style="color: rgba(0, 0, 0, 1)">))
.addInterceptor(new CatInterceptor())
.addInterceptor(new TokenHeaderInterceptor())
.build();</span></pre>
</div>
<p>&nbsp;</p>
<p>序列化Gson:</p>
<div class="cnblogs_code">
<pre>在app &gt;<span style="color: rgba(0, 0, 0, 1)"> build.gradle文件中dependencies下添加依赖

implementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.google.code.gson:gson:2.8.6</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p>使用:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 序列化</span>
LoginResponse okResponse = new LoginResponse(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">登录成功</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                String loginSuccessStr </span>=<span style="color: rgba(0, 0, 0, 1)"> new Gson().toJson(okResponse);
                System.out.println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">登录成功:</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(0, 0, 0, 1)">loginSuccessStr);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 反序列化</span>
LoginResponse obj =<span style="color: rgba(0, 0, 0, 1)"> new Gson().fromJson(dataString, LoginResponse.class);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (obj.code == <span style="color: rgba(128, 0, 128, 1)">0</span>) {...}</pre>
</div>
<p>&nbsp;</p>
<p>图片加载:</p>
<div class="cnblogs_code">
<pre>implementation <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.github.bumptech.glide:glide:4.11.0</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>
<p>数据存储</p>
<p>- 一般存储在xml或者sqlite3中</p>
<p></p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> 新增
#登录成后,把token的值,存储到手机端的xml中</span>---<span style="color: rgba(0, 0, 0, 1)">开始
SharedPreferences sp</span>= getSharedPreferences(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sp_token</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,MODE_PRIVATE);
SharedPreferences.Editor edit</span>=<span style="color: rgba(0, 0, 0, 1)">sp.edit();
edit.putString(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,r.token);
edit.commit();
# 登录成后,把token的值,存储到手机端的xml中</span>---<span style="color: rgba(0, 0, 0, 1)">结束


# </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)"> 删除
# 删除xml中的值</span>--<span style="color: rgba(0, 0, 0, 1)">开始
SharedPreferences sp1</span>=getSharedPreferences(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sp_token</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,MODE_PRIVATE);
SharedPreferences.Editor edit</span>=<span style="color: rgba(0, 0, 0, 1)">sp1.edit();
edit.remove(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
edit.commit();
# 删除xml中的值</span>--<span style="color: rgba(0, 0, 0, 1)">结束


# </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)"> 获取
# 从xml中取出当时存放的token值</span>----<span style="color: rgba(0, 0, 0, 1)">开始
SharedPreferences sp</span>=getSharedPreferences(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sp_token</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,MODE_PRIVATE);
String token</span>=sp.getString(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">);
Log.e(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xxxxx</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,token);
# 从xml中取出当时存放的token值</span>----结束</pre>
</div>
<p>存储位置:</p>
<div class="cnblogs_code">
<pre># 保存到手机上:`/data/data/<span style="color: rgba(0, 0, 0, 1)">包名`
adb shell
</span><span style="color: rgba(0, 0, 255, 1)">su</span><span style="color: rgba(0, 0, 0, 1)">
cd </span>/data/<span style="color: rgba(0, 0, 0, 1)">data
cd 包名         # cd com.lanlang.loginDemo

cd shared_prefs # 保存过才有
</span><span style="color: rgba(0, 0, 255, 1)">ls</span>
<span style="color: rgba(0, 0, 255, 1)">cat</span> sp_token.xml# 打印出xml中的值</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>使用参考:https://zhengw-tech.com/2024/06/29/okhttp-interceptor/</p>
<p>1)引入依赖</p>
<p>项目视图下, 找到app &gt; build.gradle文件<em id="__mceDel" style="font-family: &quot;Courier New&quot;; font-size: 12px">dependencies中引入okhttp3</em></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">dependencies {

    implementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">androidx.appcompat:appcompat:1.4.1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    implementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.google.android.material:material:1.5.0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    implementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">androidx.constraintlayout:constraintlayout:2.1.3</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
   
    implementation </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.squareup.okhttp3:okhttp:4.9.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
   
    testImplementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">junit:junit:4.13.2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    androidTestImplementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">androidx.test.ext:junit:1.1.3</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    androidTestImplementation </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">androidx.test.espresso:espresso-core:3.4.0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>2)在android视图下, 找到 app &gt; manifests &gt;&nbsp;AndroidManifest.xml文件中 application的上面加允许访问网络</p>
<div class="cnblogs_code">
<pre>&lt;uses-permission android:name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">android.permission.INTERNET</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;</pre>
</div>
<p>3) 支持http</p>
<p>在res/xml下新建security.xml,写入</p>
<div class="cnblogs_code">
<pre>&lt;?xml version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1.0</span><span style="color: rgba(128, 0, 0, 1)">"</span> encoding=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span>?&gt;
&lt;network-security-config&gt;
&lt;base-config cleartextTrafficPermitted=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
&lt;/network-security-config&gt;</pre>
</div>
<p>在AndroidManifest.xml文件中application中加入配置:</p>
<div class="cnblogs_code">
<pre>android:networkSecurityConfig=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">@xml/security</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>&nbsp;</p>
<p>retrofit介绍<br>        retrofit是对okhttp的封装,底层基于okhttp3,也是一个发送网络请求的库,更简单一些<br>    后续,有的app发送网络请求,使用okhttp3,有的app会使用retrofit</p>
<div class="cnblogs_code">
<pre>implementation <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.squareup.retrofit2:retrofit:2.9.0</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>详细的使用:&nbsp;https://blog.51cto.com/u_15930680/5991226</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>其他操作:</p>
<p>1)转义.gradle目录文件</p>
<p>Android Studio的.gradle文件夹保存的是从网络中下载的 gradle 配置文件,每次更新 gradle 之后,就会有新的文件下载到该文件夹中</p>
<p>将.gradle文件夹转移到其他盘中</p>
<p>解决:配置环境变量 GRADLE_USER_HOME</p>
<p>默认.gradle文件夹的路径是C:\Users\登录名\.gradle目录,所以只需要在环境变量里面配置GRADLE_USER_HOME的值为其他盘就行了</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">变量名:GRADLE_USER_HOME
变量值:L:\WindowsWork\Android\.gradle</span></pre>
</div>
<p><img src="https://img2024.cnblogs.com/blog/1128896/202409/1128896-20240910101856798-2132967149.png" alt="" loading="lazy"></p>
<p>&nbsp;android studio中也需要设置下: Build Tools &gt; Gradle 中的Gradle user home</p>
<p><img src="https://img2024.cnblogs.com/blog/1128896/202409/1128896-20240910101927143-1418884634.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 16px">常见错误:</span><br><strong>1.java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy</strong><br>这是因为正常需要使用https来请求的<br>解决:<br>(1)APP改用https请求</p>
<p>(2)targetSdkVersion 降到27以下</p>
<p>(3)更改网络安全配置<br>1.在res文件夹下创建一个xml文件夹,然后创建一个network_security_config.xml文件</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config cleartextTrafficPermitted="true" /&gt;
&lt;/network-security-config&gt;
</pre>
</div>
<p>  </p>
<p><br>2.接着,在AndroidManifest.xml文件下的application标签增加以下属性:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">&lt;application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/&gt;
</pre>
</div>
<p>  </p>
<p>4) 在AndroidManifest.xml配置文件的&lt;application&gt;标签中直接插入</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">android:usesCleartextTraffic="true"
</pre>
</div>
<p>  </p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xingxia/p/18382376/Android
頁: [1]
查看完整版本: Android开发