2019级软件工程应用与实践-人工智能快递柜(代码分析3)

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配置文件详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值