2021SC@SDUSC
出现问题
原因:
Android studio 中gradle版本不一样导致运行问题
解决方案总结:
方法一:
File > Sync Project with Gradles Files.
Build > Rebuild project
方法二:
1.将classpath 修改为项目本地的路径
2.在该文件下compileSdkVersion 下面添加buildToolsVersion
3.打开gradle目录下的wrapper目录下gradle-wrapper.properties的这个文件,将distributionUrl=https://services.gradle.org/distributions/中最后的gradle修改为自己的gradle。
参考博客:Android studio 中gradle版本不同导致运行错误的解决方案
项目代码总览
manifests文件:安卓的全局描述文件
java文件:java的源码文件,java类文件都放在里面
res文件:资源文件,如布局文件、图片文件一般都放在里面
manifests文件代码分析
在manifests文件中一般只有一个AndroidManifest.xml文件,作为安卓的全局描述文件。每个android程序中必须的文件,它位于整个项目的根目录。我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息。
Manifest:属性
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sdu.cislc.lcms.cabinet">
其AS默认生成。
xmlns:android:定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
package:指定本应用内java主程序包的包名,它也是一个应用进程的默认名称
Application:属性
<application android:name=".CabinetApplication"
android:allowBackup="true"
android:usesCleartextTraffic="true"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:requestLegacyExternalStorage="true">
android:name
为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
若该类(比方androidMain类)是在声明的package下,则可以直接声明android:name=”androidMain”,但此类是在package下面的子包的话,就必须声明为全路径或android:name=”package名称.子包名成.androidMain”
android:allowBackup
Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中AndroidManifest.xml文件中的allowBackup属性值,其属性值默认是true。当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。
android:usesCleartextTraffic
指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。
android:label
为许可提供的,为字符串资源。当用户去看许可列表(android:label)时,这些字符串资源就可以显示给用户。label应当尽量简短,只需要告知用户该许可是在保护什么功能就行。
android:icon
声明整个APP的图标,图片一般都放在drawable文件夹下
android:roundIcon
圆形桌面Icon
android:supportsRtl
支持RTL
android:supportsRtl详细介绍
android:theme
一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。
android:requestLegacyExternalStorage
安卓10开始,要想访问外部存储的所有文件,除了动态申请权限 和 权限申明外,必须在主工程AndroidManifest.xml中加上一句话,android:requestLegacyExternalStorage=“true”,用于申请外部存储所有文件的权限
Activity:属性
<!--入口首页-->
<activity android:name=".MainActivity"
android:theme="@android:style/Theme.NoTitleBar"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!--存放页面-->
<activity android:name=".HomePageActivity">
</activity>
<!--com 测试页面-->
<activity android:name=".serial.DeviceBindActivity">
</activity>
记录了入口首页、存放页面、测试页面不同的activity
meta-data:属性
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
android:name
元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried
android:resource
资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。
Service
<service
android:name="com.cislc.shadowutils.ShadowService"
android:enabled="true"
android:exported="true"></service>
<service android:name="sdu.cislc.lcms.cabinet.service.CabinetService"/>
android:enabled
Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。
android:exported
这个属性用于指示该activity或Service是否能被其他程序应用组件调用或跟它交互;取值为(true | false),如果设置成true,则能够被调用或交互,否则不能;设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
service与activity
【1】service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的
【2】service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
【3】service与activity间的通信
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责。具体可参照:http://zhangyan1158.blog.51cto.com/2487362/491358
Provider:属性
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="sdu.cislc.lcms.cabinet.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
android:authorities:标识这个ContentProvider,调用者可以根据这个标识来找到它
android:grantUriPermission:对某个URI授予的权限
uses-permission
<!--允许使用摄像头权限-->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
<!--<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>-->
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- <uses-permission android:name="android.permission.INTERNET" />-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
为了保证Android应用的安全性,应用框架制定了比较严格的权限系统,一个应用必须声明了正确的权限才可以使用相应的功能,就是我们最经常使用的权限设定标签.
适应屏幕大小
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:id="@+id/GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="4"
android:orientation="horizontal"
android:rowCount="6"
tools:context=".MainMenu" >
界面需要适配文件柜的安卓屏幕,因此使用 ConstraintLayout 约束布局。
本博客参考资料:
Android开发从入门到精通(项目案例版)
Android项目结构和AndroidManifest.xml
AndroidManifest.xml 最全详解
[无线] AndroidManifest.xml配置文件详解