赶鸭子上架之安卓开发速成

亲测:博主有课内学的粗浅的JAVA基础,其余从0开始,7天做出了一个“蓝牙智能窗帘”的APP。事实上,如果不是纠结蓝牙的一个bug不肯改方案,其余的学习和完成应该用了不到三天。

一、安装软件和环境

1.1. 安装JDK

JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。

没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。

img

1.2 下载并安装ADT集成开发环境和Android SDK

ADT:Android 集成开发环境,命名为 Android Developer Tools。

第一种装ADT的方式是:Eclipse+Android SDK+ADT Plugin。

第二种方法是安装Android Studio。

我采用的第二种方法。

查看Android Studio版本号:help->About

image-20200522222005702

按着软件安装管家里装的,成功装好了(JDK和adb是之前自己装的)

二、Hello World

2.1 手机端设置

2.2 创建工程

参考自:使用Android Studio开发Android APP

我选的最低Android版本是23,即6.0版。

2.3 一些小get

  1. 插上手机后日志框不停输出,看着烦人:

    将Log等级设为Debug,日志筛选为app名

    控制Log输出

  2. 找不到SDK:

    可能因为版本等不知名问题,有的sdk版本不能用,这时通过修改Gradle Scripts目录下的build.gradle(Module:app)来更改SDK,我使用的设置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
    applicationId "com.example.dell.smartcurtain"
    minSdkVersion 23
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    }

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.2.0'
    }

    然后序列化一下:

    序列化

Android Studio采用gradle来构建项目,gradle是一个项目构建工具,可以完成软件环境部署和打包等任务。在build.gradle文件中写项目的配置,比如引用外部仓库的工具等。你在Android Studio写好的代码最终要下载到手机里,或者打包成apk发布出去,这里的工作就依赖gradle完成。

项目中一般会出现2个或者多个build.gradle文件,一个在根目录下,一个在app目录下。

如果切换到Android模式下则全部在Gradle Scripts。

如果报错 unable to find valid certification path to requested target:

  1. 我的经验:找到这三个地方,把cacerts换成别人的能用的应该就行了吧
    image-20200522231041795
 换完之后重启IDE,或者在IDE里File->Invalidate Caches / Restart,之后再File->Settings里看这里有没有证书,有的话应该就好了。

 <img src="Android/image-20200523001137929.png" alt="image-20200523001137929" style="zoom:50%;" />

​ 这个方法参考自:https://www.jianshu.com/p/89ca5b635d3f

  1. 另一个方法看起来很有用,但我没试过:https://blog.csdn.net/da_caoyuan/article/details/104343058

我用的gradle是:

1
2
3
gradle:1.5.0

https\://services.gradle.org/distributions/gradle-2.8-all.zip
  1. 文件结构:

    我们一般关心的只是app这个目录,

    java:我们写Java代码的地方,业务功能都在这里实现

    res:存放我们各种资源文件的地方,有图片,字符串,动画,音频等,还有各种形式的XML文件。

    res目录下所有的资源文件都会在R.java文件下生成对应的资源id,我们可以直接通过资源id访问到对应的资源;这个R文件可以理解为字典,res下每个资源都都会在这里生成一个唯一的id

    AndroidManifest.xml://App基本信息(Android管理文件)

    java://Java代码,包含工程和新建是默认产生的Test工程源码。

    res://资源文件,类似Eclipse。

    layout://App布局及界面元素配置,另外在一些特定的机型上,我们做屏幕适配,比如480*320这样的手机,我们会另外创建一套布局,就像:layout-480x320这样的文件夹!。

    mipmap:

    	ic_launcher.png://App图标 
    
    		mipmap-hdpi:高分辨率,一般我们把图片丢这里
    
    		mipmap-mdpi:中等分辨率,很少,除非兼容的的手机很旧
    
    		mipmap-xhdpi:超高分辨率,手机屏幕材质越来越好,以后估计会慢慢往这里过渡
    

    values://雷同Eclipse。

    	colors.xml:定义颜色资源
    
    	dimens.xml://定义css的配置文件,定义尺寸资源。 
    
    	strings.xml://定义字符串的配置文件。
    
    	styles.xml://定义样式资源。
    

    三个常用文件解释

  2. 修改APP的图标和名称

    https://blog.csdn.net/zhangkaidsy/article/details/74852470

  3. 调试输出方法

    在class内定义private static final String TAG = "MyActivity";

    然后在需要输出的地方使用Log.e(TAG, "构造监听线程成功!");

    然后在程序运行时,在控制台查看输出,输出过滤设置为:

    Log过滤

  4. Android Studio快速打开别人的项目

  5. 学习资源:

    • 官方API文档

三、开始真正的项目

3.1 页面布局

通过修改res->layout->activity_main.xml来进行页面布局

activity_main

可以在Design通过拖拽完成设计

也可以在Text通过代码实现。

我个人喜欢Design初步设计,然后通过Text细调设置。为了简单起见,使用绝对布局。

注意事项:

  1. 页面中有文字时,最好不要直接在xml中写,而是在res/values/strings.xml中设置:

    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="message">下一步</string>
    </resources>

    引用时使用android:text="@string/message",这样做可以做到一改全改,另外,颜色的设置也最好在color.xm中类似设置。(参考自:https://blog.csdn.net/iqv520/article/details/7579513)

  2. 创建res/values/array.xml

    参见:Android使用xml文件中的array资源

    这么做的原因同1.

  3. Listview更新数据的三种方法

3.2 蓝牙

有两种方式,一种是会弹出提示的:

1
2
Intent enablelntent=new Intent(BluetoothAdapter. ACTION_REQUEST_ENABLE); 
startActivityForResult(enablelntent,1);

一种是静默模式的,这种模式需要在Androidmanifest文件中添加权限(添到开头,application前):

1
2
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

我是看极客学院的两个视频学习的,但是视频中的代码不能实现蓝牙串口模块的收发,只能发送不能接收,原因可能是因为同一个设备既做客户端又做服务端,然后线程冲突了。

事实上,蓝牙有两种使用方式,一种就是传统的BlueToothSocket,然后发送和接收放在两个单独的线程。还有一种是低功耗蓝牙专用的蓝牙透传。

3.3 WIFI

Wi-Fi Direct API主要包含如下几部分。

  • WifiP2pManager类。该类中提供了允许用户发现、请求和连接其它支持Wi-Fi Direct设备的API。
  • 用于监听Wi-Fi Direct请求的广播接收器。
    • WifiP2pManager.WIFL_P2P_STATE_CHANGED_ACTION:检测Wi-Fi是否可用,并且将检测结果通知相应的窗口。
    • WifiP2pManager.WIFL_P2P_PEERS_CHANGED_ACTION:调用WifiP2pManager.requestPeers方法获取成功连接的设备列表。
    • WifiP2pManager.WIFL P2P_CONNECTION_CHANGED_ACTION:响应Wi-Fi连接状态(连接或断开)。
    • WifiP2pManager.WIFL_P2P_THIS_DEVICE_CHANGED_ACTION:响应设备的Wi-Fi状态变化。
  • 被Wi-Fi Direct框架检测到的事件通知,例如,终止连接、发现新的Wi-Fi Direct设备等。

授权

1
2
3
4
5
6
<uses-sdk android:minSdkVersion="14"/>
<uses-permission android:name="android.permission.ACCESS_WIFL_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFL_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3.4 遇到的问题和解决

1. 无法创建新class

https://stackoverflow.com/questions/45497266/unable-to-parse-template-class

**解决:**Go to File->setting->editor->file and code templates, select Class in the files tab and paste this:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") public class ${NAME} { }

四、组件布局

安卓四大组件

  1. Activity:Activity用于显示用户界面,用户通过Activity交互完成相关操作,一个App允许有多个Activity
  2. Service:Service是Android提供一个允许长时间留驻后台的一个组件,最常见的用法就是做轮询操作!或者想在后台做一些事情,比如后台下载更新!
  3. BroadCastReceiver:BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,比如电量低或者充足,刚启动完,插入耳机,输入法改变等, 发生这些时间,系统都会发送广播,这个叫系统广播,每个APP都会收到,如果你想让你的应用在接收到 这个广播的时候做一些操作,比如:系统开机后,偷偷后台跑服务。这个时候你只需要为你的应用 注册一个用于监视开机的BroadcastReceiver,当接收到开机广播就做写偷偷摸摸的勾当~
  4. ContentProvider:我们想在自己的应用中访问别的应用,或者说一些ContentProvider暴露给我们的一些数据, 比如手机联系人,短信等!我们想对这些数据进行读取或者修改,这就需要用到ContentProvider了!或者我们自己的应用,想把自己的一些数据暴露出来,给其他的应用进行读取或操作,我们也可以用到ContentProvider,另外我们可以选择要暴露的数据,就避免了我们隐私数据的的泄露。

4.1 Activity

1. 概念

可以与用户交互的基本图形呈现单元

2. 三种状态

  • 运行状态:可以操作
  • 停止状态:不可见,比如按了home键
  • 暂停状态:新的activity把后面的遮盖

3. 生命周期

State diagram for an Android Activity Lifecycle.

图片来自:https://developer.android.com/reference/android/app/Activity

4. 常见操作

  • 配置AndroidManifest.xml,<application>中的<activity>子节点,里面的name为activity类名

  • 启动自己写的activity(这里命名为Aty1):

    • 首先要把activity配置到AndroidManifest中;

    • 然后为它新建一个布局;

    • 然后在自己的activity的java文件中重写onCreate方法,在该方法中使用setContentView(R.layout.xml布局文件名),这样两者就绑定在一起了(只有执行这句话之后,才能在后面使用findViewById);

    • 在MainActivity.java需要显示自己的activity的地方写:

      1
      2
      Intent i = new Intent(MainActivity.this,Aty1.class);
      startActivity(i);
  • 关闭activity:

    在Aty1.java中需要关闭activity的地方写finish();

  • 主activity向自定义activity传送数据

    • 传送字符串等简单数据:

      • 在MainActivity.java中构造完Intent后,startActivity()前的地方写i.putExtra("txt",“Hello Aty1”);,第一个参数是文本类型,第二个参数是内容。
      • 在Aty1.java中写getIntent().getStringExtra("txt")
    • 传送由一些简单数据构成的复杂数据:

      • 在MainActivity.java中构造完Intent后的地方写

        1
        2
        3
        Bundle data = new Bundle();
        data.putString("txt","Hello Aty1");
        i.putExtras(data);
      • 在Aty1.java中写

        1
        2
        Bundle data = getIntent().getExtras();
        String txt = data.getString("txt");
  • 自定义activity向主activity传递数据

    • 在MainActivity.java中不能使用startActivity(),而要使用startActivityForResult(i,0),第一个参数是Intent对象,第二个参数是requestCode,它与重写的onActivityResult方法的第一个参数有关,被启动的activity有返回值时会调用这个方法。

    • 在Aty1.java中需要传递数据的时候写

      1
      2
      3
      4
      Intent i = new Intent();
      i.putExtra("result","Hello MainActivity");
      setResult(0,i);
      finish();
    • 在MainActivity.java中重写onActivityResult方法:

      1
      2
      3
      4
      5
      @Override
      protected void onActivityResult(int requestCode,int resultCode,Intent data){
      String result = data.getStringExtra("result");
      super.onActivityResult(requestCode,resultCode,data);
      }

4.2 Service

(略)

4.3 Fragment

1. 什么是Fragment

封装布局和代码的组件

手机和平板电脑显示效果不同

2. 什么时候用Fragment

  • 逻辑共享
  • 保存状态
  • 回退导航
  • 整体移动

3. 一些注意

xml布局文件中要写包括对应的java类

onCreateView是Fragment生命周期方法中最重要的一个。因为在该方法中会创建在Fragment中显示的View。

//装载布局文件
View view=inflater.inflate(R.layout.my_fragment,null);

请我喝杯咖啡吧~

支付宝
微信