2016-04-07 08:53:10 Amo_te_ama_me 阅读数 1173
  • C++ Qt进阶之复杂控件自定义

    要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓? 通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

    1171 人正在学习 去看看 陈超

在判断一个应用程序是系统程序还是用户程序时,经常用到下面一端代码:

int flags = packInfo.applicationInfo.flags;//应用程序信息的标记
            if((flags&ApplicationInfo.FLAG_SYSTEM)==0){
                //用户程序
                appInfo.setUserApp(true);
            }else{
                //系统程序
                appInfo.setUserApp(false);
            }

为何获得应用程序的标记后,后面要用flags&ApplicationInfo.FLAG_SYSTEM的方式来判断是否为系统程序呢?
点进packInfo.applicationInfo.flags的源码:

......
public static final int FLAG_SYSTEM = 1<<0;

    /**
     * Value for {@link #flags}: set to true if this application would like to
     * allow debugging of its
     * code, even when installed on a non-development system.  Comes
     * from {@link android.R.styleable#AndroidManifestApplication_debuggable
     * android:debuggable} of the &lt;application&gt; tag.
     */
    public static final int FLAG_DEBUGGABLE = 1<<1;

    /**
     * Value for {@link #flags}: set to true if this application has code
     * associated with it.  Comes
     * from {@link android.R.styleable#AndroidManifestApplication_hasCode
     * android:hasCode} of the &lt;application&gt; tag.
     */
    public static final int FLAG_HAS_CODE = 1<<2;

    /**
     * Value for {@link #flags}: set to true if this application is persistent.
     * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
     * android:persistent} of the &lt;application&gt; tag.
     */
    public static final int FLAG_PERSISTENT = 1<<3;

    /**
     * Value for {@link #flags}: set to true if this application holds the
     * {@link android.Manifest.permission#FACTORY_TEST} permission and the
     * device is running in factory test mode.
     */
    public static final int FLAG_FACTORY_TEST = 1<<4;
    ......

可以看到每个标记都是1<<序号的形式,即表示1向左位移动n位,即:

1<<0=1;左移0位
1<<1=2;左移1位
1<<2=4;左移2位
1<<3=8;左移3位
……

为什么google要用这种方式设计呢?我们来看,上面几个标记位移后8位二进制数为:

标记
FLAG_SYSTEM 0000 0001
FLAG_DEBUGGABLE 0000 0010
FLAG_HAS_CODE 0000 0100
FLAG_PERSISTENT 0000 1000

而获得int flags = packInfo.applicationInfo.flags;//应用程序信息的标记后,拿flag与之相与,我们知道与操作,对应二进制位上全为1才为1。
假设flag=0011,与上面系统标记相与,结果中:FLAG_DEBUGGABLE和FLAG_SYSTEM不为0,表示这个程序既有FLAG_DEBUGGABLE和FLAG_SYSTEM两个属性。

所以,这种设计的方便之处在于,方便比较和一个flag能表示很多个状态。

2011-12-05 22:31:51 xyf28190374 阅读数 330
  • C++ Qt进阶之复杂控件自定义

    要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓? 通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

    1171 人正在学习 去看看 陈超

                           android之路-第一个android应用程序

在搭建还好android环境之后,接下来就要着手写我们的第一个android应用程序了

最好的理解就是实践,所以让我们用实践来慢慢深入理解android。

首先启动Eclipse

在项目区域中右键,新建一个 android project

(如果右键菜单栏中没有选项,那么肯定在other中了)

1,写好项目名称,选择好自己使用的android版本

2,创建包,完成project的创建

OK,如下图:

接下来启动android虚拟机

运行刚才新建的项目,在虚拟机中会显示刚才锁搭建的project项目,也就是最简单的应用程序

运行成功,虚拟机上会有如下显示:

返回,查看虚拟机应用程序,会发现多了一个图标:

这就是我们的第一个android应用程序啦!!

当然了,这个程序上的文字是可以改的,就是在这里:

好吧,改掉它!!

(这里注意,在改掉他之后,要单击选定class3gActivity.java文件,再运行虚拟机!!要不然有可能报错!!)

第一个android应用程序,完成!!!

2014-04-09 10:06:17 gary531 阅读数 2257
  • C++ Qt进阶之复杂控件自定义

    要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓? 通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

    1171 人正在学习 去看看 陈超

Android应用、Window应用和Web应用这3种应用是我们目前比较主流的应用程序开发类型,其实他们之间的设计思路有许多相同的地方,也有不同的地方。在各种技术之间相互借鉴,有助于我们理解Android应用开发模式的一些设计思路。下面总结一下我在Android应用开发学习过程中对一些概念的理解。

1、开发Android应用程序时界面资源通过XML文件来定义,可以与Java源码分离,同时自动在R.java生成一个整形ID,在Java源码中可以通过这个ID来这个资源,使得对这些资源操控变得容易。在界面定义上3种应用比较类似,Window应用界面也有专门的资源文件,程序中可以引用修改,Web应用界面通过HTML来定义,然后在Javascript中可以对DOM树进行操作,对界面进行修改。

2、ContentProvider封装屏蔽了不同底层数据访问方式的差异,将自己通过AndroidManifest.xml注册到系统中,并提供统一的RESTful风格的URL,客户端通过这个URL来访问ContentProvider中的数据,访问的方式类似于数据库访问,使得应用程序之间的数据传递变得容易和统一,同JDBC的访问方式有些类似。

3、Intent定义了在一个活动中调用另外一个活动的机制,先定义Intent来指定调用哪一个活动及携带的操作数据,然后用这个Intent与xml配置文件中活动所配置的Intent过滤器进行匹配,如果匹配上,就启动这个活动,调用服务和广播时也类似。

4、UI开发可以使用代码创建方式或XML定义方式,比较灵活,通常会用XML方式定义活动视图,然后用代码来给视图设置数据,设置数据的方式是定义适配器,然后再把适配器附加到视图上。不论是Windows应用还是Web应用对UI的定义,都提供了UI文件定义和代码获取UI定义部件然后修改两种方式。

5、活动使用布局管理器来组织排布各个视图,很多UI系统都会使用类似布局管理器的东西来组织UI组件。

6、碎片实现对活动的分隔,类似于Windows应用程序里的框架窗口,可以在活动中划分出几个独立的区域,同时由于屏幕可以做横屏竖屏转换,所以碎片在活动中的布局要做不同处理。

7、因为移动设备支持返回按键,所以启动一个新的活动或碎片时,旧的活动或者碎片要保存在一个返回栈中,这样当从新活动或者碎片退出时,旧的活动或者碎片能够重新显示,这种需求对于桌面应用程序是不存在的,可能类似于浏览器实现Web页面跳转的后退机制。

8、应用需要签名和4字节对齐后才能安装到手机上,这样能够避免他人用其它应用来升级你的应用;活动可以设定访问公共组件的权限,或者设定自己能被其他活动访问所需要的权限,没有权限的访问会导致错误,活动也可以通过ContentProvider把访问权限传递给另一个活动。安全性的保护算是Android应用的一个特点,Windows应用和Web应用没有定义这样安全机制。

9、AsyncTask在主线程提交任务到后台线程池执行,同时在主线程创建一个Handler,任务在后台执行时,可以通过向主线程的Handler发消息,Handler监听到消息后触发一些回调函数在主线程执行,从而实现任务处理过程中对界面的更新。

10、本地服务只可以被同一应用程序调用,而AIDL服务可以被另外的应用程序调用,并且可以通过Pracelable在客户端和AIDL服务之间传递复杂数据,服务通常运行在主线程上,它不会自动创建子线程,需要运行超过5s的任务需要手动创建子线程来执行。

11、一个包通常是一个应用程序,两个包使用相同的用户id时可以互相访问对方的数据。可以建立专门的库项目,然后被其他的项目所包含。

12、处理程序通过放置一个消息到应用程序主线程队列中,后续队列处理这个消息时,能够回调执行相应的处理程序。

13、工作线程在主线程创建一个Handler,然后把Handler传给工作线程,工作线程执行时给Hanlder发消息,Handler监听到消息后再执行相应的处理。它与AsyncTask的区别是AsyncTask是封装好的线程池,比起工作线程的方式,AsyncTask在操作主线程上更方便,因为onPreExecute()、onPostExecute()及更新主线程方法onProgressUpdate()均运行在主线程中,这样就不用给Handler发消息处理了。

14、广播接收程序通过AndroidManifest.xml将自身注册到到系统中后(也可通过程序注册到系统中),就可以接受并处理客户端进程发送的广播消息,它可以运行在客户端进程内或者进程外的独立进程。

15、通知是先设置内容视图,再定义一个Intent,然后调用通知管理器,把通知发送出去,当用户点击通知时,会触发调用之前定义的Intent。

16、要长时间运行广播接收程序,需要启动一个服务,然后由服务启动一个线程,通过给这个线程发送消息,来驱动线程处理需要长时间运行的任务。

17、主屏幕部件类似于Windows系统上的快捷方式,但不同的是还可以定期更新一些显示数据,是一种与底层数据完全分离的远程视图。它是一个Android应用程序,通过定义一个部件接收程序以及相关联的配置视图,当部件接收程序第一次启动时会调用相应的配置视图,配置视图取得用户输入信息后更新部件视图,后续当部件接收程序被系统定期更新时,会取得相应的更新数据并更新部件视图,从而达到定期更新显示数据的效果。

(完)

2014-08-04 20:35:56 taiyb 阅读数 458
  • C++ Qt进阶之复杂控件自定义

    要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓? 通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

    1171 人正在学习 去看看 陈超

Android 应用程序之道

摘要:阐述了编写Android应用程序的几大方面,包括:Android操作系统与其应用程序的关联、组件、UI、存储、通信、NDK。着重于这几方面我们所应该理解和掌握的知识点,以及注意的知识点。

关键词:Android;关联;组件;UI;存储;通信;NDK

0 前言

当今智能手机高速发展着,以Android为平台的智能手机占据了整个智能手机市场的一半以上,Android除了在智能手机市场上发力外,还在平板电脑,上网本,电视机等诸多领域发展着,因此我们编写的应用程序的市场也将更加的广泛,并且随着后PC时代的来临,智能手机,平板电脑等将越来越普及,功能越来越强大并向PC靠拢,可以想象我们编写的Android应用程序功能和用途也将更加强大和广泛。那么我们又应该怎样编写Android应用程序?我们在编写Android应用程序时又应该注意哪些方面? 因此本文接下来我将成6个方面来阐述Android应用程序编写之道: Android操作系统与应用程序的关联 ,Android特有的组件框架, Android应用程序UI框架 , Android应用程序数据的存储, Android 应用程序的通信及Android NDK。

1  Android操作系统与应用程序的关联

大家都知道Android操作系统是开源的,我们可以下载其源码来分析Android操作系统和其应用程序的关系,可以使我们写出更好和更稳定的应用程序,在此我主要是重逻辑的角度来阐述Android操作系统于应用程序的关联。

我们知道Android应用程序是运行于Android平台之上的,那么我们应该怎样来看待Android平台与应用程序?当我们把Android操作系统当作以经集成好的机器,应用程序就是在操作系统上在集成一些新的功能模块,根据系统所提供的小的组件(零件)来组装一个有一定功能和用途的模块,在把模块组装上操作系统,成某种意义上应用程序是对操作系统功能的扩充,犹如现代社会的规格化,集成化得机器一样,你的应用程序就是组装上的一个模块而已,那些更小的模块组装成你的应用程序。但是那些模块是操作系统所提供的。你给出那些你所需的模块(组件),由操作系统负责组装成你的应用程序,在由操作系统把你的应用程序组装于它自身之上。

每个组件都有着特定的功能和用途,操作系统为每个应用程序分配唯一的ID 和唯一的空间,应用程序运行其中,相对这说应用程序是私有的,应用程序各有不同的需求,有的应用程序要和别的应用程序通信,或应用程序自身内部的通信,有的应用程序要使用别的应用程序的功能或系统的功能,有的应用程序要使用系统的数据或别的应用程序的数据。

从Android开发者官网,我们可知Android操作系统的上层是以Java为基础的,因此在很大部分程度上Android应用程序的编写和编写Java的应用程序没有什么区别。对于已经熟悉Java应用程序的编写的人员来说在Android上进行编写应用程序只需熟悉Android所特有的那部分技术就能过很好的在Android编写应用程序。因此对于想要在Android上编写应用程序的人员来说:

首先的让自己熟悉Java,理解Java应用程序的编写。

其次再应该让自己熟悉Android所特有的部分,即可以在Android上编程应用程序了。

 

2  Android特有的组件框架

Android应用程序是以组件为基础的,就像Java以对象为基础一样,当然组件内仍是对象的思想。Android应用程序就一个由各种组件所集成应用程序。我们的应用程序可以使用系统提供的组件或别人编写的组件,同时我们编写的组件也能被别人的应用程序使用。这样做的好处是能过实现代码的复用,减少编程的工作量。 本文讲述了应用程序都需的Manifest文件和Android的四大核心组件及Intent和IntentFilter。

2.1 Manifest文件

Manifest文件是应用程序中很重要的一部分,是Android组件集合的场所。Android操作系统是通过对Manifest文件的检查来决定应用程序组合了那些组件,然后再根据在其中声明的初始化各组件以及组件基本的功能。由于程序是由组件所组成的,其中有些组件和功能是程序使用了别的程序的了,就像在现实生活中一样,你使用别人的东西,你首先等获得别人的权限,在Android应用程序中权限的声明也是位于Manifest文件中的。同时在Manifest文件中可以对程序对硬件的要求和其特点进行声明。应用程序是运行于操作系统之上的,Manifest文件就像操作体系表明你是有什么组成的,以及你有拥有的功能和对硬件的要求。

2.2 Activity组件

Activity是应用程序最基本的组件之一,大部分的应用程序都继承了该组件,从某种意义上可以说Activity是应用程序的入口,应用程序起动后所获得界面都在Activity中构造,即UI界面一般都在Activity构造。对现代化得应用程序而言,UI界面已经成为了应用程序所必需有的。因为它使得程序操作更加简单明了,容易。

Activity包含7中状态,分别为create,start,Resume,destroy,Pause,Stop,Restart,对于create状态,于Activity初次创建时进行,在create状态中用户一般可以进行初始化操作。如:绑定数据对列表,创建视图等,在destroy状态中进行有些资源的回收工作,resume状态即是获得了当前焦点的状态。应用程序一般在create和destroy中进行编码即可,因此应用程序都要一般要重写onCreate函数和onDestroy函数。

其整个生命周期如下图1-1所示:

    

图1.1

你应该根据你自己的需求在其生命周期内构造符合自己要求的代码。

 

2.3 Service组件

Service是Android应用程序重要组件之一,Service是运行于后台的没用有UI界面的,能够进行长时间的操作的组件,如果你想进行长时间的操作如:播放音乐,成网上下载资源等,一般应用Service组件。但请注意:Service并没有开启一个新的线程,Service仍然在主线程内运行,因此在编写长时间操作时应该在Service内启动一个新的线程来进行长时间操作。

Service可以分为独立的Service和绑定组件的Service,但是对于BroadcastReceiver只能通过startService函数启动Service,对于独立的Service而言,Service包含create,start,destroy三个状态,create状态一般用于一些初始化处理,并且在Service存活的生命周期内是create状态只能存在一次,即onCreate函数只调用一次,start状态是可以调用多次的函数,在其中可以放入一些长时间的或需反复操作的代码。

Destroy状态一般用于资源的回收。调用onDestroy函数后服务即销毁。独立的Service通过调用startService函数起动。其整个生命周期如图1-2所示,对于绑定Activity的Service,相对于独立的Service而言其生命周期去掉了start,添加了onbind和onunbind,于独立的Service有着相同的功能,bind起到了和独立Service中start函数的功能, 组件可以通过调用unBindService函数来解除与服务的绑定,注意:多个组件可以绑定同一个Service。只有当所有的组件都不在绑定Service时,操作系统才把Service销毁。



                                                                                                                                                        图1-2

2.4 BroadcastReceiver组件

BroadcastReceiver用于接收系统广播或应用程序的广播,对于自定义的广播接收器都需要重写onReceive函数,当你接收到广播后的后续动作都都放于onReceive函数中。对于操作系统而言对自身的很多活动都会发出广播,你的应用程序可以通过注册广播接收器来接收当系统或某一应用程序的某一事件发生时发生的广播,你就知道某一事件发生了,比如当系统启动时,或你接收来电时,短信都会发出广播,你可以通过接收广播来写些特殊功能的软件。Broadcast在一定程度上起着跟中断相同的功能,只是广播是不会中断其正在运行的程序的。同时可以看成是成消息机制抽离而来的,Android的消息机制一般用应用程序内部通信,Android把其抽离出来形成单独的广播,有助有我们理解和使用,同时也更加符合组件和对象的思想。

2.5 Content Providers组件

Content Providers(内容提供者)是Android的组件之一,应用程序用它来向外提供数据,以便外部程序通过ContentResolver来解析应用程序所提供的数据,从Content Providers内有一个管道接口,可以看出Android在这点上利用了Java管道的方法,利用管道来实现数据的分享。Content Providers扮演的公共使用室的角色。

2.6 Intent和IntentFilter

Intent和Intent Filter(意图和意图过虑器),Android各组件有自己的目的,它想要做什么想完成什么,都可以在Intent内声明,有些可以显示声明,有些可以隐示声明即通过Intent Filter来声明,Intent可以用来在各组件之间传递消息,并且Intent可以携带数据给目的组件,来起动其它的组件。如可以通过startActivity函数来启动Activity组件,通过startService函数来启动Service。

3  应用程序UI之道

Android UI界面是通过两种方式来实现:一是通过xml文件的形式,二是通过自己编写代码的方式来,谷歌推荐使用xml文件的形式来呈现UI,因为以文件的形式来呈现UI,有利于管理和修改UI中的设置,并且符合对象的思想。UI就好像人的外表,它呈现给使用者更加直观的映现,便于使用者操作和使用,和用户交互。

Android UI采用如下的方式来呈现UI:




图1-3

从中我们可以看出Android UI的呈现是采用嵌套的形式,即ViewGoup中嵌套View或ViewGroup,再在ViewGroup中进行嵌套来实现UI的。

我们对UI的设计可以采用Android提供的控件,来设计UI,通过一层又一层的嵌套来实现复杂的UI界面,对于Android所提供的控件我们应该重点掌握LinearLayout,RelativeLayout,FrameLayout,ListView,ImageView,TextView,Spinner,Menu,AlertDialog

ProgressBar,Button,EditText等,以上控件都是继承至View或View的子类,除了掌握Android本身提供的控件和其继承关系外,我们还应该掌握自定义控件的编写。对于自定义控件的编写,一般采用的方法是让我们自己的类去继承Android所提供的控件,或控件的父类,一般我们可以继承View类来编写自己的控件,对于继承View的类,我们最主要的是要实现其构造函数,onDraw函数和事件处理函数,对于onDraw函数,由于onDraw函数的参数是Canvas类,所以我们可以获取Canvas,通过其提供的函数来绘制图形,对于事件处理一般是对按键事件和触摸事件进行处理,在相应的函数中实现当某一事件发生时所要做的动作。以便实现自己想要的外观和功能。

总之,对于Android UI其大体上的思想和其它的UI是一样的,为了实现好的UI界面我们要对系统提供的控件和自定义控件都有相当的了解,才能很好的实现UI。

4  Android数据之存储

对于Android数据的存储有多种方法,本文主要讲述以SQLite数据库的形式,SharedPreferences的形式,以及xml文件的形式的数据存储方式。

4.1 SQLite

SQLite是轻量级的,是支持SQL语句的,用于嵌入式设备的开源的数据库。 为了对SQLite数据库进行操作,Android为我们提供了一套API以便让我们来使用和操作SQLite数据库,对于SQLite我们应该自己编写一个类继承于SQLiteOpenHelper,并实现SQLiteOpenHelper中的抽象方法,然后通过它的函数SQLiteDatabase对象,就可以通过SQLiteDatabase来操作SQLite数据库。当然我们也可以不用SQLiteOpenHelper,但是通过SQLiteOpenHelper可以帮助我们更好的操作数据库。

 

4.2 SharedPreferences

SharedPreferences是用于存储一些用户配置的数据SharedPreferences采用的是键值对的来存储数据的,SharedPreferences是个接口我们通常通过getSharedPreferences函数来过的SharedPreferences对象,对SharedPreferences对中的数据的读取于对Map的读取差不多,但是要对其中数据进行修改的话我们应该根据SharedPreferences中的函数来获得SharedPreference.Editor类,用它来对SharedPreferences中的数据进行修改。

请注意,Android系统提供给了我们PreferenceActivity类。用于对数据的存储。

4.3 Xml

Xml称为可扩展标记语言,Android为我们提供了API用于对xml文件的操作,我们可以把我们想要存储的东西于xml文件中,然后再读取xml文件即可获得我们存储的内容。我们一般把xml转换成类的形式,在转换之前我们应该知道类的基本结构。xml的读取是根据xml中的标签和属性。对于xml文件的读取有多种方法:Sax,Dom,Pull。Sax,Dom,Pull对于解析xml文件各有其优势。都根据其不同的策略来解析xml文件,本质上仍然是根据xml文件的格式来解析的,以sax为例:我们首先要获得SAXParser对象通过SAXParserFactory,注意其采用的是工厂模式,然后通过SAXParser的函数parse来解析xml。注意的是解析的时候有要用到DefaultHandler或HandlerBase,所以我们要编写类继承于DefaultHandler或HandlerBase并在实现

对解析事件的处理。

5  Android应用程序之通信

Android通信可以分为,应用程序内部通信和应用程序之间的通信。对应用程序内部通信:我们可以使用Intent意图,Handler。Handler用于在线程之间进行通信,由于Handler是于初始化Handler的线程绑定的,因此我们可以在一个线程中初始化Handler,在另一个线程中调用Handler中提供的函数来使得线程之间进行通信。Intent是用在组件之间进行通信的,我们可以在Intent中装入我们自己的数据来达到组件之间通信的目的。对于Android应用程序之间的通信:Android应用程序之间的通信:包括Http,Tcp/Ip ,蓝牙通信,Wifi通信等这些一般都用于网络通信之中和AIDL应用于进程之间的通信,对于AIDL其内部机理是所采用的Binder框架(Binder框架采用的客服端和服务端的模式,客服端和服务端通过Binder驱动来通信)。对于服务端Android为我们提供了AIDL工具。我们只要编写.aidl文件,AIDL工具会为我们生成Java接口,然后编写类继承Service,并实现AIDL工具为我们生成的Java接口。对于客服端通过bindService函数来绑定AIDL服务端来获取服务对象。

6  Android NDK

Android提供了NDK以便我们使用C和C++语言,NDK的使用能是我们对应用程序进行更加细腻的操作,定制我们所特有的功能,同时也为我们对硬件的操作提供的支持而不仅仅使用Android所提供的API来操作硬件。Android NDK的实现是使用Java本地函数来实现的,我们可以定义本地函数,然后再自己用C或C++来实现本地函数。由于Java本地函数有着自己的一套输入输出规范。我们本地函数的定义要遵循其规范。请注意我们的应用程序也应该编写Android.mk文件和Application.mk文件,以便编译器编译。

7 结束语

本文Android应用程序的6大方面,从中我们可以看出其与Java应用程序的主要区别,我们可以根据它们的区别来编写我们自己的Android应用程序。

参考文献:

[1] http://developer.Android.com/

[2]李宁.《Android开发权威指南》.人民邮电出版社,2011,09

[3]柯元旦. 《Android内核剖析》.电子工业出版社,2011,09

[4]李青﹑王瑜﹑赵丞兵 译. 《Android开发秘籍》.人民邮电出版社,2011,09

[5]王家林. 《大话企业级Android应用开发实战》. 电子工业出版社,2011,08


此是很早之前所写的一点关于android的东西。

 

2012-05-28 17:49:48 p892848153 阅读数 6
  • C++ Qt进阶之复杂控件自定义

    要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓? 通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

    1171 人正在学习 去看看 陈超

android 退出应用程序因为,android Activity的特殊性,导致想要完整的关闭一个由多个activity组成的应用程序是非常困难的,如果,activity调用方式错综复杂,那就更难完整的关闭了。以我的理解,在android里一个Activity就等同于一个独立的应用程序,所以,即便你认为几个Activity合起来才算是一个整体的应用程序,但android不会这么认为。所以,你会发现使用System.exit(0);来关闭应用程序,只会关闭当前显示的Activity,不会关闭所有的Activity。
我看了一些帖子,他们说设计一个应用程序时,最好由一个Activity调用所有的Activity,不要嵌套的调用。
下面给出关闭Activity的两种方法。
1). System.exit(0);
2). android.os.Process.killProcess(android.os.Process.myPid());
以上只是个人观点,在这次做项目时得出的一些结论,可能不太准确,还待修改。
在开发一个android应用软件时,考虑如何关闭应用程序的问题。一开始采用当前Activity调用finish()来完成,但这种做法是不对的。 这几天通过阅读Android的frameworks层代码时,发现平台提供了关闭程序的方法。 在ActivityManager类中提供了如下的方法:

如下:

/**

* Have the system perform a force stop of everything associated with

* the given application package. All processes that share its uid

* will be killed, all services it has running stopped, all activities

* removed, etc. In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED}

* broadcast will be sent, so that any of its registered alarms can * be stopped, notifications removed, etc.

*

* You must hold the permission * {@link android.Manifest.permission#RESTART_PACKAGES} to be able to

* call this method.

*

* @param packageName The name of the package to be stopped.

*/

public void restartPackage(String packageName) {

try {

ActivityManagerNative.getDefault().restartPackage(packageName);

} catch (RemoteException e) { } }

ok,我们只需要取得ActivityManager的实例,并调用该方法即可正常关闭应用。 以下是关闭程序的代码片段:

private void exit2() {

ActivityManager actMgr = (ActivityManager) this .getSystemService(ACTIVITY_SERVICE);

actMgr.restartPackage(getPackageName()); }

调用上述方法就能彻底地关闭掉程序,一般仅仅调用finish()是无法彻底关闭程序的。 但要注意一点,调用系统服务需要在AndroidManifest.xml文件中增加权限。SDK2.1后就被废弃了,因为这个方法会关闭同其他应用程序共享的Service,

 

 

 

1.int version = android.os.Build.VERSION.SDK_INT;

                            ActivityManager activityMgr = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);

                            if (version <= 7) {

                                   activityMgr.restartPackage(mContext.getPackageName());

                            } else {

                                   mContext.stopService(new Intent(mContext, MusicService.class));

//                                 activityMgr.killBackgroundProcesses(mContext.getPackageName());

//需要权限KILL_BACKGROUND_PROCESSES

                                   android.os.Process.killProcess(pid);

                            }

<!-- 关闭应用程序的权限 -->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />

 

2.int pid = android.os.Process.myPid();

android.os.Process.killProcess(pid);   //杀死当前进程

3.this.finish()     thisà当前activity   //杀死当前进程

 

首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看Android开发网是如何实现的吧.

  1. Dalvik VM的本地方法

  android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。
  System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

 2. 任务管理器方法

   首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,我们直接结束自己的package即可,直接使用ActivityManager类的restartPackage方法即可,参数为package name,该类通过getSystemService(Context.ACTIVITY_SERVICE)来实例化ActivityManager对象,这种方法系统提供的,但需要显示声明权限,所以使用中需要综合考虑。

 3. 根据Activity的声明周期

   我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

 在A窗口中使用下面的代码调用B窗口    //返回Home界面,貌似可行。

Intent intent  = new Intent(Intent.ACTION_MAIN);

 intent.addCategory(Intent.CATEGORY_HOME);

  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  startActivity(intent);

  System.exit(0);

首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看Android开发网是如何实现的吧.

 

4:自己写一个Application,在内部自己管理Acitvity,与版本无关,绝对可以。

 


没有更多推荐了,返回首页