20189200余超 2018-2019-2 移动平台应用开发实践第六周作业

20189200余超 2018-2019-2 移动平台应用开发实践第六周作业

Android简介、活动、UI组件

1.Android系统架构

  • 这是Android系统架构图,够一目了然了吧,Android大致可以分为四层架构,五块区域,Linux内核层(Linux Kernel)、系统运行层、应用框架层(Application Framework)、应用层(Applications)。

1.1,Linux内核层
  Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、WiFi驱动、电源管理等。

1.2,系统运行层
这一层通过一些C/C++库来为Android系统提供了主要的特性支持,比如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供浏览器内核的支持等。同时,在这一层还有Android运行时库,它提供了一些核心库,能允许开发者使用Java来编写Android应用。其中,关键是Dalvik虚拟机,它使得我们每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例,相比Java虚拟机(JVM),Dalvik是专门为移动设备定制的,它对手机内存、CPU性能有限等情况做了优化处理。

1.3,应用框架层
这一层主要提供了构建应用时可能用到的API,Android自带的一些核心应用程序就是使用这些API完成的,开发者可以通过使用这些API构建自己的应用程序。比如有活动管理器、View系统。内容提供器、通知管理器等。

1.4,应用层
所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者我们从Google Play上下载的程序,包括我们自己开发的应用程序。

2,Android已发布的版本
Android 1.0(没有开发代号)
Android 1.1 - Petit Four
Android 1.5 - Cupcake
Android 1.6 - Donut
Android 2.0/2.1 - Éclair
Android 2.2 - Froyo
Android 2.3 - Gingerbread
Android 3.0/3.1/3.2 - Honeycomb
Android 4.0 - Ice Cream Sandwich
Android 4.1/4.2/4.3 - Jelly Bean
Android 4.4 - KitKat
Android 5.0/5.1 - Lollipop(Android L)
Android 6.0 - Marshmallow(Android M)
Android 7.0 -Nougat(Android N)
Android 8.0 -Oreo(Android O)
Android 9.0 -Pie (Android P

** 3,Android应用特色**
Android主要有什么特色呢,有以下几个方面来体现:四大组件、丰富的系统控件、SQLite数据库等持久化技术、地理位置定位、强大的多媒体、传感器。
  3.1,四大组件
什么是四大组件?分别是活动(Activity)、服务(Service)、广播接收器(BroadCast Receiver)和内容提供器(Content Provider)。其中活动(Activity)就是Android应用程序中看得东西,也是用户打开一个应用程序的门面,并且与用户交互的界面,比较高调。服务(Service),则比较低调了,一直在后台默默的付出,即使用户退出了,服务仍然是可以继续运行的。广播接收器(BroadCast Receiver),则允许你的应用接收来自各处的广播消息,比如电话、短信等,可以根据广播名称不同,做相应的操作处理,当然了, 除了可以接受别人发来的广播消息,自身也可以向外发出广播消息,自产自销。内容提供器(Content Provider),则为应用程序之间共享数据提供了可能,比如你想要读取系统电话本中的联系人,就需要通过内容提供器来实现。
3.2,丰富的系统控件
Android系统为开发者提供了丰富的系统控件,我们可以编写漂亮的界面,也可以通过扩展系统控件,自定义控件来满足自我的需求,常见控件有:TextView、Buttion、EditText、一些布局控件等。
3.3,持久化技术
Android系统还自带了SQLite数据库,SQLite数据库是一种轻量级、运算速度极快的嵌入式关系型数据库。它不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作,让存储和读取数据变得非常方便。
3.4,地理位置定位
移动设备和PC相比,地理位置定位是一大亮点,现在基本Android手机都内置了GPS,我们可以通过GPS,结合我们的创意,打造一款基于LBS的产品,是不是很酷的事情啊,再说,目前火热的LBS应用也不是空穴来风的,不过在天朝,因为可恶的GFW,只能用些本土化的地图API,比如百度地图、高德地图。要是哪天能用上大谷歌的地图,那才是高大上啊。
3.5,强大的多媒体
Android系统提供了丰富的多媒体服务,比如音乐、视频、录音、拍照、闹铃等,这一切都可以在程序中通过代码来进行控制,让你的应用变得更加丰富多彩。
3.6,传感器
Android手机中内置了多种传感器,比如加速传感器、方向传感器,这是移动设备的一大特点,我们可以灵活地使用这些传感器,可以做出很多在PC上无法实现的应用。比如“微信摇一摇"_你懂得,“搜歌摇一摇”等功能。
4,Android开发环境
 开发环境搭建所需要的软件,配置等攻略,相信大家网上搜一搜,这类文章太多了。这里只强调重要几个工具:Android SDK、Eclipse、ADT。
  4.1,Android SDK
Android SDK谷歌提供的Android开发工具包,在开发Android程序时,我们需要引用该工具包,里面包含了开发Android应用程序的API。
4.2,Eclipse
开发Java应用程序的神器,最好用IDE工具之一,特点是开源、超强的插件功能、可支持多种语言开发。当然除此之外,谷歌也推出了Android Studio,专门针对Android程序定制的,但因为Android Studio才刚推出不久,不太稳定,毕竟新工具问题还是比较多的,Eclipse被应用已经很成熟了,网上各种关于Eclipse疑难杂症的解决方案很多,相比Android Studio就比较少了。
4.3,ADT
ADT全称叫做"Android Development Tools",是谷歌提供的一个Eclipse插件,用于在Eclipse提供一个强大的、集成的Android开发环境。
4.4,Android Studio
Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。

5,Android程序结构
5.1,src
毫无疑问,src目录是放置我们所有Java代码的地方,它在这里的含义和普通Java项目下的src目录是完全一样的。

5.2,gen
这个目录里的内容都是自动生成的,主要有一个R.Java文件,你在项目中添加任何资源都会在其中生成一个相应的资源ID,这个文件永远不要手动去修改它。

5.3,assets
这个目录里主要可以存放一些随程序打包的文件,在你的程序运行时可以动态读取到这些文件的内容。另外,如果你的程序中使用到了WebView加载本地网页的功能,所有网页相关的文件也都存放在这个目录下。

5.4,bin
这个目录页不需要过多的关注,它主要包含了一些在编译时自动产生的文件。当然,会包括一个编译好的安装包,后缀为.apk的文件。

5.5,libs
如果你的项目中使用到了第三方的jar包,就需要把这些jar包放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。

5.6,res
这个目录下的内容就有点多了,简单点说,就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下,前面提到的R.Java中的内容也是根据这个目录下的文件自动生成的。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下。

5.7,AndroidManifest.xml
这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件中注册。另外还可以在这个文件给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。

5.8,proguard-project.txt
在发布你的程序时候,有些apk文件容易被人反编译,所以此时这个文件就发挥作用了,用来混淆你的程序代码,让别人不那么容易看到源代码。

5.9,project.properties
指定了编译程序时候所用的SDK版本

Android 四大组件之 " Activity "
1,什么是活动(Activity)
 活动(Activity)是最容易吸引用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互,一个应用程序可以包含零个或者多个活动。这是我对活动的理解,那我们再看看官方文档是怎么定义的:“An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.”大概意思是说,Activity是一个可以让屏幕提供用户交互动作的组件,比如打电话、照相、发送邮件和查看地图等。简单来说,我们在应用程序中能看到的内容,绝大多数都是Activity组件提供的。

2,活动(Activity)用法
在一个应用程序中,有多个Activity组成,其中,有一个特殊的Activity,那就是“main”Activity,代表了应用程序启动,看到的首个界面。每个Activity启动其他的Activity可以通过不同动作。接下来我们来创建一个Activity。

2.1,创建一个Activity
为了创建一个Activity,我们必须要继承Activity的子类,比如:public class MainActivity extends Activity。同时我们也要重载两个方法onCreate()、onPause(),代码如下:

其中onCreate()方法在你的activity创建的时候就调用了,你可以在这个方法中初始化一些常量、资源的连接,其中最重要的是setContentView()方法去加载活动界面的布局。onPause()方法往往是当你活动交互暂停时,一些在界面上填过的交互数据可以在这里保存,以免造成丢失,用户体验不好。
可以看到每一个应用程序,都必须有一个AndroidManifest.xml。

可以看到,活动的注册在标签中,这里通过标签来对活动进行注册的,首先我们使用了android:name属性来具体注册哪一个活动,在这里我们对我们刚才定义的MainActivity类进行注册,由于在最外层的标签中已经通过package属性指定了包名是com.example.helloworld,因此在注册活动时这一部分就可以省略了,当然你可以定义为com.example.helloworld.MainActivity,不过直接使用.MainActivity也就足够了,然后我们使用了android:label指定活动中的标题栏的内容,标题栏是显示在活动的最顶部的,需要注意的是,给主活动指定的label不仅会成为标题栏的内容,还会成为启动器(Launcher)中应用程序显示的名称。之后在标签的内容我们加入了标签,并在这个标签里添加了这两句声明。表示在手机上点击应用图标时,首先启动的就是这个活动,如果你的应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是你无法在启动中看到或者打开这个程序。这种没有主活动的应用程序,基本都是用为第三方服务居多,比如支付宝快捷支付服务。
基本上以上两个步骤的结合,这个活动就能在应用程序中运行了。
3,活动(Activity)生命周期
  在说说Activity生命周期之前,我们先来理解"Activity返回栈”的概念。在Android中,多个Activity定义在一个Task中,也就是说一个Task是一组Activity的集合,然后Activity又被安排在back stack,即返回栈,是按照后进先出的规则进出栈的。如图:

当从手机中启动一个应用程序图标时,应用程序的Task随之也变成前台进程,如果首次启用时,发现不存在Task实例,那么系统会创建一个Task实例,然后把"main”Activity放入到stack中,默认是栈顶,这样一个Task就管理了一组栈,栈里管理多个Activity。当从Activity1中启动Activity2时,Activity1被推到栈底,Activity2变成栈顶,同理,Activity3进栈的过程和Activity2是一样的,如果我们按back按钮,则Activity3被弹出,系统会根据内存情况进行销售或者回收,Activity2则被推到栈顶,以此类推。当一直按back,返回到主页面,则所有的activitys被全部弹出,则task不复存在。同时,task有两种状态:Foreground和Background,前景和背景。当处于Background时,所有的activitys是停止的,当处于Foreground时,表示当前用户交互的应用程序。

比如两个应用程序A和B,我们刚开始启动了A应用程序,此时Task A是Foreground,用于与用户交互,当我们点击Home Button时,此时Task A变成Background,里面所有的activitys都是停止的,此时如果我们又启动了B应用程序,Task B又会被实例化,Task B变成Foreground,不过Task A仍然是Background,一直等待着被恢复。所以是Android也是一个多任务的系统,不同任务是可以被互相切换的。
好了关于Task和Stack就先了解这么多,接下来讲讲Activity的生命周期。每个活动在其生命周期中最多可能会有四种状态
运行状态
暂停状态
停止状态
销毁状态
  3.1,运行状态
当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。

3.2,暂停状态
当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。比如对话框的形式只会占用屏幕中间的部分区域,你很快就会在后面看到这种活动,处于暂停状态的活动仍然是完全存活的,系统也不愿意去回收这种活动,只有在内存极低的情况下,系统才会去考虑回收这种活动。

3.3,停止状态
当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。系统仍然会为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。

3.4,销毁状态
当一个活动从返回栈中移除后就变成了销毁状态。系统会倾向于回收处于这种状态的活动,从而保证手机的内存充足。

3.5,七个方法
Activity类中定义了七个回调方法,覆盖了活动生命周期的每一个环节。有如下七个方法:

onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
onRestart()

onCreate():每个活动中我们都会重写这个方法,它会在活动第一次被创建的时候调用,比如完成一些初始化操作,加载布局、绑定事件等
onStart():这个方法在活动不可见变为可见的时候调用
onResume():这个方法在活动准备好和用户进行交互的时候调用,此时的活动一定位于返回栈的栈顶、并且处于运行状态。
onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
onStop():这个方法在活动完全不可见的时候调用。它和onPause()方法主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法不会执行。
onDestroy():这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

除此之外,活动又可以分为三种生存期

完整生存期:活动在onCreate()和onDestroy()方法之间所经历的
可见生存期:活动在onStart()和onStop()方法之间所经历的
交互活动期:活动在onResume()和onPause()方法之间所经历的
如图:

UI组件
1.Toast组件的使用

<Button
        android:id="@+id/button20"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Toast显示文本"
        android:clickable="true"
        android:onClick="viewText"/>
public void viewText(View v){
        //getApplicationContext() 应用程序上下文,作用域为整个程序  全局变量
        //this:当前对象(当前界面的上下文)
        //参数(上下文,要显示的文本内容,显示的时间(Toast.LENGTH_LONG、Toast.LENGTH_SHORT))
        Toast.makeText(getApplicationContext(),"今天天气真好!晴空万里",Toast.LENGTH_LONG).show();
    }

  1. Toast显示图片和图文
<Button
        android:id="@+id/button21"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignEnd="@id/button20"
        android:layout_alignRight="@id/button20"
        android:layout_below="@id/button20"
        android:text="Toast显示图片"
        android:onClick="viewImage"/>
/*
    * Toast显示文本
    * @prama v
    * */
    public void viewImage(View v){
        Toast t=new Toast(this);
        //用于显示图片的组件
        ImageView imageView=new ImageView(this);
        //为图片组件设置图片(不能以数字命名)
        imageView.setImageResource(R.drawable.cat);
        t.setView(imageView);
        t.setDuration(Toast.LENGTH_LONG);
        //设置显示的位置
        t.setGravity(Gravity.TOP,0,0);
        t.show();
    }

通知
通知(Notification)是Android中一个比较有特色的功能,由于受到用户的认可和喜爱,IOS后来也加入了类似的功能。那么本篇文章就对Android Notification的使用方法做一个详细说明。Notification实际上是一则消息,不过这个消息显示在应用程序UI界面之外。也即是说,当你发出一条通知,它首先会在手机最上方的状态栏显示一个通知图标,下拉状态栏后可以看到通知详细内容。
创建一个最简单的通知
创建一个通知,你需要首先创建Notification.Builder对象,语法如下:
Notification.Builder builder = new Notification.Builder(this)
其中,this是Context实例。
然后使用builder开始构建通知的外观,有三个内容必须要进行设置的,缺一不可。

通知图标:由builder.setSmallIcon()设置
通知标题:由builder.setContentTitle()设置
通知内容:由builder.setContentText()设置
下表列出了Notification.Builder类中的其他一些常用方法:

接着就调用NotificationCompat.Builder.build()方法来创建出Notification实例。最后将创建出来的Notification实例传递给NotificationManager.notify()方法就可以弹出一条通知。

下面代码创建并显示了一个最简单的通知:

布局文件,activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center"
              android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello world"
        android:textSize="22sp"/>

MainActivity.java :

public void notification(View view)
{
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    Notification.Builder builder =
            new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                    .setContentTitle("通知标题")
                    .setContentText("通知内容")
                    .setAutoCancel(true);

    Intent intent = new Intent(this, NotificationActivity.class);
    PendingIntent pi = PendingIntent.getActivity(this, 0, //
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pi);

    manager.notify(0, builder.build());
}

第13行,创建了一个Intent实例,这个Intent用于启动NotificationActivity;第14行,使用PendingIntent.getActivity()方法创建一个PendingIntent实例,第一个参数是Context对象;第二个参数是requestCode,一般传0就可以;第三个参数是一个Intent对象;第四个参数是flag,这里给PendingIntent.FLAG_UPDATE_CURRENT,当然还有别的flag,大家可以查阅相关文档。第16行,调用builder.setContentIntent(pi)方法将创建好的PendingIntent对象设置进去。下面是程序运行效果:

posted @ 2019-04-07 16:29  余超20189220  阅读(197)  评论(0编辑  收藏  举报