Android高级应用开发(基础篇) - stage3 - 学习笔记

掌上设备开发的局限性:

1、更低的处理器

2、有限的内存

3、有限的存储能力

4、小屏幕和低分辨率

HVGA:Half VGA——480*320(VGA:640*480)

QVGA:Quarter VGA——320*240

WVGA:Wide VGA——800*480

5、数据传输和高成本

6、数据传输的低速度和高延迟

7、不稳定的数据连接

8、有限的电量


开发时要考虑的问题:

1、性能:更快更灵敏

2、响应能力:拒绝ANR

何时会ANR:点击事件和按键事件5秒钟无响应 或 接收到消息后10秒钟没有处理返回

如何避免:IO操作(File,Sql,Network)和复杂的运算(游戏的运算)最好用异步

3、无缝的与第三方程序的交互、无缝的前台后台的切换

4、安全:对操作权限的考虑


Android应用程序基本特性:

1、.apk是android应用程序安装格式,.dex是android二进制执行文件格式

2、android操作系统是基于Linux的多用户操作系统

3、默认情况下,一个应用程序一个userid,系统设定的无需手动设定,针对这样的应用程序,该用户有权限进行所有操作

4、每一个进程有自己的虚拟机实力,所有每个应用程序相对独立

5、默认情况下,应用程序都有自己的linux进程,系统会决定何时关闭它,当资源不够的时候

6、然而也有例外,可以给两个应用程序共享同一个userid,让彼此之间共享资源

应用程序可以请求访问系统资源,比如通讯录、短信等,但需要安装时被授权(AndroidManifest文件中声明)


应用程序四大组件(都需要在全局配置文件中注册)

1、Activity

是Android应用程序的一个界面,一个应用程序通常包含多个Activity,Activity通过布局管理添加各种View组件,通过setContentView(int)方法可以将视图呈现出来

2、Service

运行在后台,负责处理一些用户看不到,并且会有持续时间的事情,不生成UI,所有用户实现的Service必须继承系统的Service类,并在配置文件中注册

3、Content Provider

数据在android中是程序私有的,Content Provider提供了多个程序间数据交互的机制,暴露出来一些标准的API对数据进行操作

4、Broadcast Receiver

负责对外部事件做出相应,不生成UI,必须继承系统的BroadcastReceiver类,在程序中注册,应用程序可以通过Context.sendBroadcast()将自己的intent广播出去,其他程序可以通过自身的Broadcast Receiver截获后进行时间处理


重要对象Intent

四大组件中三大组件都需要Intent(Activity、Service和Broadcast Receiver)

传递Intent启动一个Activity:startActivity和startActivityForResult

传递Intent启动一个Service:startService和bindService

通过Intent新加入一个广播:sendBroadcast、sendOrderedBroadcast和sendStickyBroadcast

执行一个查询:ContentResolver的query()


资源目录values相关:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="title">test</string>

    <color name="blue">#0066CC</color>

    <dimen name="left_margin">10dp</dimen>
    <dimen name="large_font_size">16sp</dimen>
    
    <array name="string_array">
        <item>item1</item>
        <item>item2</item>
        <item>item3</item>
    </array>

</resources>


res文件夹下的文件不是简单的通过文件名来映射的

strings.xml文件中的dimen项也能获得,实际上是通过标签映射到了R文件中

(相当于默认的文件夹只是一些系统命名用来方便管理归类的定义的文件)


dimen的单位:

px(screen pixels)像素

in(physical inches)英寸

pt(physical points)点距

mm(physical milimeters)毫米

dp(density-independent pixels relative to a 160-dpi screen)密度无关像素

sp(scal-independent pixels)范围无关像素


结论:长宽高用dp,字体用sp

<dimen name="left_margin">10dp</dimen>
<dimen name="large_font_size">16sp</dimen>

value目录下也可以新建一些其他的文件

mystyle.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    
    <style name="NormalText">
        <item name="android:textSize">12sp</item>
        <item name="android:textColor">@color/black</item>
    </style>

    <style name="BitText">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">@color/blue</item>
    </style>
    
</resources>


drawable资源不一定只是图片文件,还有可能是xml

Button的background

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item android:drawable="@drawable/head_btn_bg_pressed" android:state_focused="true"/>
    <item android:drawable="@drawable/head_btn_bg_pressed" android:state_selected="true"/>
    <item android:drawable="@drawable/head_btn_bg_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/head_btn_bg_pressed" android:state_enabled="false"/>
    <item android:drawable="@drawable/head_bg"/>
 
</selector>
(一般pressed、focused和正常状态的即可)


CheckBox的background

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:state_checked="false" android:drawable="@drawable/checkbox_not_check" />

    <item android:state_checked="true" android:drawable="@drawable/checkbox_check" />

</selector>


动画

分为两种:

1、tweened animation(补间动画/渐变动画):放在res/anim文件夹下

2、frame by frame animation(逐帧动画/画面转换动画):放在res/drawable文件夹下


res/menu下view.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/menu_about" android:title="About"></item>
    <item android:id="@+id/menu_exit" android:title="Exit"></item>
    <item android:id="@+id/menu_other" android:title="Other"></item>
    
</menu>


代码中调用res中的属性

this.getResource.getXXX(R.XXX.**);


资源文件调用res中的属性

@符 + 资源类型(标签名,如string)+ / + 属性名称

但是主题类型的使用: ?符 + style + / + 主题名称


在android.R文件中定义了一些res属性

代码中可以使用android.R.layout.***

xml中使用@android:color/transparent即可以调用


Manifest文件及其声明

1、应用程序的全局配置文件

2、应用程序的入口配置


Manifest文件约定:

1、Element(元素)

(1) 元素全部用小写

(2)<manifest><application>必须有且仅有一个

(3)同一级别的元素顺序无关,除了<activity-alias>

说明:<activity-alias>是为activity指定别名,其中targetActivity属性会引用Activity,所以必须放在目标Activity之后

2、Attribute(属性)

(1)属性都是可选的

(2)除了<manifest>的属性,其他元素属性都有android前缀,但是在类里面这些都是去掉的

说明:元素都是类,每一个元素最终都会被映射到对应的类里,属性就是类的属性(Android源码可以看Manifest.java等类)

3、声明类的名字:声明一个package,类名用“. + 类名”展示

<manifest . . . >
    <application . . . >
        <service android:name="com.example.project.SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

<manifest package="com.example.project" . . . >
    <application . . . >
        <service android:name=".SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

两种方式结果相同,第二种更加方便

4、使用多值

<intent-filter . . . >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    . . .
</intent-filter>

5、资源值

使用资源方式:@[package:]type:name

<activity android:icon="@drawable/smallPic" . . . >

使用主题方式: ?[ package :] type : name


Manifest文件的结构

<?xml version="1.0" encoding="utf-8"?>

<manifest>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />  
    <uses-feature />  
    <supports-screens />  
    <compatible-screens />  
    <supports-gl-texture />  

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>


uses-feature也提示使用权限,与uses-permission不同

uses-feature是给Android Market使用的

Android Market会根据uses-feature过滤所有你设备不支持的应用。

通过使用<uses-feature>元素,一个应用可以指定它所支持的硬件型号,

举个例子,有些设备不支持多点触控或者OpenGL ES 2.0,或者不支持NFC而程序又需要,

那么过滤器就会过滤需要这些硬件支持(多点触控或者OpenGL ES 2.0)的应用,

用户就不会在android market上看到这些应用。


Manifest解析过程(方式:反射)

1、应用程序安装的时候,manifest信息会放到一张系统索引表里

2、系统启动的时候,PackagedManageService读取Manifest信息

3、应用程序启动是,Launcher进行系统级判断,比如最小SDK等

4、四大组件在需要的时候实例化


Android生命周期


1、Active Process/Foreground Process 活动进程/前台进程

·正处于Activity Resume()状态

·正处于与bound服务交互的状态

·正处于服务在前台运行的状态,(startForegound()被调用)

·Service生命周期函数正在被执行(onCreate(), onStart(), onDestroy())

·BroadcastReceiver正在执行onReceive()方法

杀死Foreground Process需要用户相应 —— 因为这个安全优先级是最高的

2、Visible Process

·当前进程不是焦点进程,Activity不在前端显示,但也没有完全隐蔽,能够看得见

例如弹出一个对话框(Input Method),或者收到短信

·一个bound到visible或者foreground的activity的Service

3、Service Progress

·正在运行的,不在上述两种状态的Service

4、Background Process

·不可见状态的Activity进程,有没有任何相关Service运行的(onStop()被调用),

系统有个后台进程列表,一般情况采取后进先出的原则来释放后台进程资源

5、Empty Process

·没有运行任何Components的进程,保留这个进程主要是为了缓存的需要


按home键 ——> Background Process

按back键 ——> Empty Process


Android进程启动

启动程序的时候使用PackageManager,PackageManager依赖于PackageManagerService

启动主进程的时候startActivity,如果发现不存在,则告诉zygnote需要实例化一个新的Dalvik vm并且安装


Android进程销毁

自动销毁:kernel ——> LowMemoryKiller

可以参见:http://blog.sina.com.cn/s/blog_4d66a3cb0100prfe.html

手动销毁:

首先,Activity的finish只是退出了Activity,而不是销毁进程

方法1:System.exit(0);传入参数0,代表销毁所有

方法2:Process.killProcess(Process.myPid());

方法1是系统的正常退出,方法2类似于垃圾回收,

可以在application中onTerminate方法和activity中onDestroy方法查看区别


Manifest中的application

application默认没有name,因为默认指定到了系统Applicaton类

可以自己写一个继承自Application的类

四个重载方法:

onCreate()方法:在应用生命周期启动时的

onLoewMemory()方法:当系统内存过低时调用的方法

onTerminate()方法:当应用被回收时调用的方法

onConfigurationChanged方法:当屏幕初始呈现或翻转时调用的方法(模拟器翻转快捷键:Ctrl+F11/F12)

说明:System.exit(0)和Process.killProcess(Process.myPid())都不会出发onTerminate,当然更不会调用activity的onDestroy

所以一般不推荐使用这两种方式,除非是程序和内存管理类的软件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值