Android知识总结

1. AppWidget与Android.Widget

AppWidget是桌面组件的一部分,是Home的一个插件。 Android.Widget是Android控件的聚合包,它提供Android常用的控件如:TextView,Button,EditText。

AppWidget通过继承Appwidgetprovider实现控制,而Appwidgetprovider 是继承BroadcastReceiver的,因此AppWidget是一个特殊的BroadcastReceiver。

Appwidget不是Activity。很多适用于Activity的东西,Appwidget绝大多数都无法使用。最常用的获取控件Id的方式,就是findviewbyid()。Appwidget不支持这种方法!

2. 使用RemoteViews

RemoteViews类描述了一个View对象能够显示在其他进程中,可以融合从一个 layout资源文件实现布局。虽然该类在android.widget.RemoteViews而不是appWidget下面但在Android Widgets开发中会经常用到它,主要是可以跨进程调用(appWidget由一个服务宿主来统一运行的)。

3. widget组成:bounding box (包围盒),一个frame(边框),还有widget的部分图形控件和其它部分。

4. AppWidget应用框架中,常用的几个类如下:

AppWidgetProvider:继承自BroadcastReceiver,在AppWidget应用update, enable, disable和deleted时接受通知。其中,onUpdate,onReceive是最常用到的方法,它们接受更新通知。AppWidgetProvider类作为一个便捷类来捕获App Widget广播(broadcasts).只接收于这个App Widget有关的事件广播(event broadcasts),例如当该App Widget被更新、删除、启用或禁用。当这些广播事件发生,AppWidgetProvider进行以下方法调用:

AppWidgetProviderInfo:描述AppWidget的大小,更新频率和初始界面等信息。以XML文件形式存在于应用的res/xml/目录下。

AppWidgetManager: 负责管理AppWidget, 向AppWidgetProvider发送通知

RemoteViews: 一个可以在其他应用进程中运行的类,是构造AppWidget的核心。目前,Android平台上的RemoteViews支持的布局(Layout)类暂时只有Frame-Layout, LinearLayout和RelativeLayout,并且不支持自定义类。

5. App Widget布局基于RemoteViews,它不支持所有种类的布局Layout或是view widget。一个

RemoteViews对象能支持以下布局 Layout 类:FrameLayout ,LinearLayout ,RelativeLayout

和以下 widget 类:AnalogClock, Button ,Chronometer, ImageButton, ImageView, ProgressBar ,TextView

6. Widget开发步骤

(1) 实现appwidget的layout

(2) 编写AppWidgetProvider类

(3) 配置<appwidget-provider>元素:<appwidget-provider>元素来描述appwidget的大小、布局、更新

频率等信息。

(4) 配置清单文件:appwidget需要在AndroidManifest.xml文件中配置receiver,android是通过Broadcast

来通知每一个appwidget的。

7.位置服务:又称定位服务或基于位置的服务。在开发过程中主要用到LocationManager和LocationProviders对象。LocationManager可以用来获取当前的位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报。LocationProviders是能够提供定位功能的组件集合,集合中的每种组件以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面

8. 步骤:提供位置服务,首先需要获得LocationManager对象

获取LocationManager可以通过调用android.app.Activity.getSystemService()函数实现。

在获取到LocationManager后,还需要指定LocationManager的定位方法,然后才能够调用LocationManager getLastKnowLocation()方法获取当前位置。

为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可

1

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

9.MapView的地图的显示控件,可以设置不同的显示模式,例如卫星模式、街道模式或交通模式。MapController则是MapView的控制器,可以控制MapView的显示中心和缩放级别等功能。MapActivity类负责处理显示Google地图所需的生命周期和后台服务管理。

10.通过在MapView上添加覆盖层,可以在指定的位置加添加注解、绘制图像或处理鼠标事件等 Google地图上可以加入多个覆盖层,所有覆盖层均都在地图图层之上,每个覆盖层均可以对用户的点击事件做出响应 创建覆盖层继承Overlay类的子类,并通过重载draw()方法为指定位置添加注解,重载onTap()方法处理用户的点击操作。

11.在覆盖层绘制图形或文字需要使用“画布”(Canvas)来实现,绘制的位置是屏幕坐标,这就需要将地图上的物理坐标与屏幕坐标进行转换。Projection类提供了物理坐标和屏幕坐标的转换功能,可在经度和纬度表示的GeoPoint点和屏幕上Point点进行转换 toPixels()方法将物理坐标转换为屏幕坐标,fromPixels()方法将屏幕坐标转换为物理坐标。

12. SharedPreferences是一种轻量级的数据保存方式。通过SharedPreferences可以将NVP(Name/Value Pair,

名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽对文件系统的操作过程。不仅能够保存数据,还能够实现不同应用程序间的数据共享。 13. 获取到SharedPreferences对象

SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);

MODE访问模

式(私有,全局读,全局写),之后通过SharedPreferences.Editor类对SharedPreferences进行修改,最后调用commit()函数保存修改内容。如editor.putInt("Age", 20); SharedPreferences文件就保存在/data/data/<package name>/shared_prefs目录下。 14.文件存储

内部存储:Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部存储器上,在Linux系统下的/data/data/<package name>/files目录中。

Android系统支持四种文件操作模式:MODE_PRIVATE-私有模式,文件仅能够被文件创建程序访问;MODE_APPEND-追加模式,如果文件已经存在,则在文件的结尾处添加新数据。MODE_WORLD_READABLE-全局读模式,允许任何程序读取私有文件.

资源文件:程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问。

/res/raw目录下的所有文件都会保留原有格式不变,存放视频、音频、图像和数据;

读取原始格式文件,首先需要调用getResource()函数获得资源对象,然后通过调用资源对象的openRawResource()函数,以二进制流的形式打开指定的原始格式文件。在读取文件结束后,调用close()函数关闭文件流。

/res/xml目录下的XML文件,一般用来保存格式化的数据。 15.数据库存储(SQLite)程序 public class DBAdapter {

private static final String DB_NAME = "songlist.db"; private static final String DB_TABLE = "songlist"; private static final int DB_VERSION = 1; public static final String KEY_ID = "_id"; public static final String KEY_NAME = "name"; private static SQLiteDatabase db; private final Context context; private DBOpenHelper dbOpenHelper; private

static

class

DBOpenHelper

extends

2

SQLiteOpenHelper {

public DBOpenHelper(Context context, String name, CursorFactory factory, int version){ super(context, name, factory, version);

}

private static final String DB_CREATE = "create table " + DB_TABLE + " (" + KEY_ID + " integer primary key autoincrement, " + KEY_NAME+ " text"+");"; public

void

onCreate(SQLiteDatabase

_db)

{_db.execSQL(DB_CREATE);

}

public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) {

_db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); onCreate(_db); } }

public DBAdapter(Context _context) { context = _context;

}

=

new

DBOpenHelper(context,

public void open() throws SQLiteException { dbOpenHelper try {

db = dbOpenHelper.getWritableDatabase(); }catch (SQLiteException ex) {

db = dbOpenHelper.getReadableDatabase(); }}

public long insert(Song list) {

ContentValues newValues = new ContentValues(); newValues.put(KEY_NAME, list.songName); return db.insert(DB_TABLE, null, newValues); DB_NAME, null, DB_VERSION);

}

public Cursor queryOneData(long id) {

Cursor results = db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME}, KEY_ID + "=" + id, null, null, null, null);

results; }

in

=

new

//传递数据 Intent

Intent(SongSearch.this,SearchResultActivity.class); Bundle b = new Bundle();

b.putString("songname", songname); in.putExtras(b); this.startActivity(in);

//在activity中使用数据库,并显示最终结果 db = new DBAdapter(SearchResultActivity.this); db.open();

cursor = db.select(songname); this.startManagingCursor(cursor); SimpleCursorAdapter

adpater

=

new

SimpleCursorAdapter(this,R.layout.searchresults, cursor, new String[] {DBAdapter.KEY_NAME}, new int[] {R.id.songname}); setListAdapter(adpater);

16.ContentProvider:是在应用程序间共享数据的一种接口机制

ContentProvider用途:提供了更为高级的数据共享方法,应用程序可以指定需要共享的数据,而其他应用程序则可以在不知数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。 原理:程序开发人员使用ContentResolver对象与ContentProvider进行交互,而ContentResolver则通过URI确定需要访问的ContentProvider的数据集。

步骤:程序开发人员通过继承ContentProvider类可以创建一个新的数据提供者,过程可以分为三步 (1)继承ContentProvider,并重载六个函数

(2)声明CONTENT_URI,实现UriMatcher:通过构造一个UriMatcher,判断URI是单条数据还是多条数据 为了便于判断和使用URI,一般将URI的授权者名称和数据路径等内容声明为静态常量,并声明CONTENT_URI

public static final String AUTHORITY = "cn.pdsu.peopleprovider"; public static final String PATH_SINGLE = "people/#"; public static final String PATH_MULTIPLE = "people";

public static final String CONTENT_URI_STRING = "content://" + AUTHORITY + "/" + PATH_MULTIPLE; public static final Uri CONTENT_URI = Uri.parse(CONTENT_URI_STRING); private static final int MULTIPLE_PEOPLE = 1; private static final int SINGLE_PEOPLE = 2; private static final UriMatcher uriMatcher; static {

uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //表示URI无匹配时的返回代码

3

uriMatcher.addURI(AUTHORITY, PATH_SINGLE, MULTIPLE_PEOPLE); uriMatcher.addURI(AUTHORITY, PATH_MULTIPLE, SINGLE_PEOPLE); }

使用UriMatcher时,则可以直接调用match()函数,对指定的URI进行判断 (3)注册ContentProvider

<provider android:name = ".PeopleProvider" android:authorities = "cn.pdsu.peopleprovider"/> 应用:

ContentResolver resolver = getContentResolver();//获取ContentResolver对象

Cursor cursor = resolver.query(uri, new String[] {KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT}, null, null, null); //查询目标数据

17.Service是Android系统的后台服务组件,适用于开发无界面、长时间运行的应用功能 特点:没有用户界面

比Activity 的优先级高,不会轻易被Android系统终止

即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态 用于进程间通信,解决两个不同Android应用程序进程之间的调用和通讯问题 18.Service使用方法

启动方式:通过调用Context.startService()启动Service,停止Service:可以通过其他组件或自身完成。 绑定方式:通过服务链接(Connection)或直接获取Service中状态和数据信息。 public class MathService extends Service{

public void onServiceConnected(ComponentName name, IBinder service) { ms

((MathService.LocalBinder)service).getService(); }

public void onServiceDisconnected(ComponentName arg0) { ms=null; }};

bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE); startService(serviceIntent);

=

private final IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder{ MathService getService() { return MathService.this; } }

public IBinder onBind(Intent intent) {

Toast.makeText(this, "本地绑定:MathService", Toast.LENGTH_SHORT).show(); return mBinder; } 在activity中

final Intent serviceIntent = new Intent(this, MathService.class); ServiceConnection ServiceConnection() {

mConnection

=

new

显示启动:在Intent中指明Service所在的类,并调用startService(Intent)函数启动Service,示例代码如下 final Intent serviceIntent = new Intent(this, ×××Service.class); startService(serviceIntent);

隐式启动:若服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动。在注册Service时,声明Intent-filter的action属性

<service android:name=".×××Service"> <intent-filter>

<action android:name="cn.pdsu. ×××Service" /> </intent-filter> </service>

4

然后在activity中进行隐式启动

final Intent serviceIntent = new Intent();

serviceIntent.setAction("cn.pdsu. .×××Service");

19.使用Handler更新用户界面

Handler允许将Runnable对象发送到线程的消息队列中,每个Handler对象绑定到一个单独的线程和消息队列上,当用户建立一个新的Handler对象,通过post()方法将Runnable对象从后台线程发送到GUI线程的消息队列中,当Runnable对象通过消息队列后,这个Runnable对象将被运行。

private static Handler handler = new Handler();

public static void UpdateGUI(double refreshDouble){

handler.post(RefreshLable);

}

private static Runnable RefreshLable = new Runnable(){

} };

UpdateGUI()是公有的界面更新函数,后台线程通过调用该函数,将后台产生的数据refreshDouble传递到UpdateGUI()函数内部,然后并直接调用post()方法,将 Runnable对象传递给界面线程(主线程)的消息队列中。

20.远程服务:服务和调用者在不同的两个进程中,调用过程需要跨越进程才能实现。

实现远程服务的步骤:

使用AIDL语言定义跨进程服务的接口

根据AIDL语言定义的接口,在具体的Service类中实现接口中定义的方法和属性。

在需要调用跨进程服务的组件中,通过相同的AIDL接口文件,调用跨进程服务。

首先使用AIDL语言定义的MathService的服务接口,文件名为IMathService.aidl。当用户保存文件后,ADT会自动在/gen目录下生成IMathService.java文件。

IMathService.java文件根据IMathService.aidl的定义,生成了一个内部静态抽象类Stub,Stub继承了Binder类,并实现ImathService接口

在Stub类中,还包含一个重要的静态类Proxy。如果认为Stub类实现进程内服务调用,那么Proxy类则是用来实现跨进程服务调用的。

实现跨进程服务需要建立一个继承android.app.Service的类,并在该类中通过onBind()方法返回IBinder对象,调用者使用返回的IBinder对象就可以访问跨进程服务

IBinder对象的建立通过使用IMathService.java内部的Stub类实现,并逐一实现在IMathService.aidl接口文件定义的函数

public class MathService extends Service{

private final IMathService.Stub mBinder = new IMathService.Stub() {

public long Add(long a, long b) {

return a + b; }}

public IBinder onBind(Intent intent) {

Toast.makeText(this, "远程绑定:MathService",

Toast.LENGTH_SHORT).show();

return mBinder;

}

private IMathService mathService;//在另外一个工程项目中引入ADSL文件,并进行引用上面的服务,实现远//程调用

5

public void run() { //过程代码

private ServiceConnection mConnection = new ServiceConnection() {

public void onServiceConnected(ComponentName name, IBinder service) {

mathService = IMathService.Stub.asInterface(service);

}

public void onServiceDisconnected(ComponentName name){

mathService = null;

}

21.Parcel是Android系统中应用程序进程间数据传递的容器,能够在两个进程中完成数据的打包和拆包的工作,但Parcel不同于通用意义上的序列化,Parcel的设计目的是用于高性能进程间通信(IPC)传输,因此不能够将Parcel对象保存在任何持久存储设备上.

22.AIDL是Android系统自定义的接口描述语言,可以简化进程间数据格式转换和数据交换的代码,通过定义Service内部的公共方法,允许调用者和Service在不同进程间相互传递数据

23.Intent为Activity、Service和BroadcastReceiver等组件提供交互能力

Intent的用途:启动Activity和Service;在Android系统上发布广播消息

ACTION_PICK: 启动一个子Activity,从提供的数据列表中选取一项

24.如果需要将子Activity的部分信息返回给父Activity,则可以使用Sub-Activity的方式去启动子Activity.获取子Activity的返回值,一般可以分为以下三个步骤

Intent intent = new Intent(ActivityCommunication.this, SubActivity1.class);

startActivityForResult(intent, SUBACTIVITY1);

以Sub-Activity的方式启动子Activity(调用startActivityForResult(Intent, requestCode)函数)

设置子Activity的返回值; (在子Activity调用finish()函数关闭前,调用setResult()函数将所需的数据返回给父ActivitysetResult()函数有两个参数 ):

Intent result = new Intent(null, data); setResult(RESULT_OK, result); finish();

在父Activity中获取返回值(当子Activity关闭时,启动它的父Activity的onActivityResult()函数将被调用;如果需要在父Activity中处理子Activity的返回值,则重载此函数)

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);{

}

25.Intent过滤器是一种根据Intent中的动作(Action)、类别(Categorie)和数据(Data)等内容,对适合接收该Intent的组件进行匹配和筛选的机制。Intent过滤器可以匹配数据类型、路径和协议,还包括可以用来确定多个匹配项顺序的优先级(Priority)。

<intent-filter>节点支持<action>标签、<category>标签和<data>标签

<action>标签定义Intent过滤器的“类别”:android:name--指定组件所能响应的动作,用字符串表示,使用包的完全限定名

<category>标签定义Intent过滤器的“动作”:android:category---指定以何种方式去服务Intent请求的动作 <data>标签定义Intent过滤器的“数据”Android:host:指定一个有效的主机名

Android系统提供的类别: LAUNCHER表示在应用程序启动时首先被显示。

26.解析规则:Android系统把所有应用程序包中的Intent过滤器集合在一起,形成一个完整的Intent过滤器列表 在Intent与Intent过滤器进行匹配时,Android系统会将列表中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,任何不匹配的Intent过滤器都将被过滤掉。没有指定“动作”的Intent过滤器可以匹配任何的Intent,但是没有指定“类别”的Intent过滤器只能匹配没有“类别”的Intent。

把Intent数据Uri的每个子部与Intent过滤器的<data>标签中的属性进行匹配,如果<data>标签指定了协议、主机名、路径名或MIME类型,那么这些属性都要与Intent的Uri数据部分进行匹配,任何不匹配的Intent过滤器均被过滤掉。

6

27.利用Intent发送广播消息 String UNIQUE_STRING = "cn.pdsu.BroadcastReceiverDemo";

Intent intent = new Intent(UNIQUE_STRING);

intent.putExtra("key1", "value1");

intent.putExtra("key2", "value2");

sendBroadcast(intent);

为了能够使应用程序中的BroadcastReceiver接收指定的广播消息

public class MyBroadcastReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

String msg = intent.getStringExtra("message");

Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();

}

}

28. ListView:能够通过适配器将数据和自身绑定,支持点击事件处理。

ListView listView = (ListView)findViewById(R.id.ListView01);

List<String> list = new ArrayList<String>();

list.add("ListView子项1"); list.add("ListView子项2");

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list ); listView.setAdapter(adapter);

29.TabHost:可以实现多个分页之间的快速切换,每个分页可以显示不同的内容。继承TabActivity类 Tab标签页的使用

首先要设计所有的分页的界面布局

在分页设计完成后,使用代码建立Tab标签页,并给每个分页添加标识和标题

最后确定每个分页所显示的界面布局

每个分页建立一个XML文件,用以编辑和保存分页的界面布局,使用的方法与设计普通用户界面没有什么区别。

使用:TabHost tabHost = getTabHost();

LayoutInflater.from(this).inflate(R.layout.tab1,

tabHost.getTabContentView(),true);

tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("线性布局").setContent(R.id.layout01));

使用setIndicator()函数设定分页显示的标题,使用setContent()函数设定分页所关联的界面布局

30.线性布局(LinearLayout)

Android知识总结

Android知识总结

<LinearLayoutandroid:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content">

<TextView android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="name:" /> <EditText android:id="@+id/name" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_weight="1"/>

7

</LinearLayout>

31.表格布局

<TableLayout

<TableRow android:id="@+id/TableLayout01" android:id="@+id/TableRow01" android:layout_width="fill_parent" android:layout_width="wrap_content" android:layout_height="fill_parent" xmlns:android="/apk/res/android"> android:layout_height="wrap_content">

<TextView android:id="@+id/label"

android:layout_height="wrap_content" android:layout_width="160dip" android:gravity="right" android:text="用户名:" android:padding="3dip" > </TextView>

<EditText

32.菜单

选项菜单:分为图标菜单和扩展菜单。重载Activity的onCreateOptionMenu()函数,才能够在Android应用程序中使用选项菜单

图标菜单能够同时显示文字和图标的菜单,最多支持6个子项。图标菜单不支持单选框和复选框。

扩展菜单是在图标菜单子项多余6个时才出现,通过点击图标菜单最后的子项“More”才能打开。不能够显示图标;支持单选框和复选框。

子菜单:子菜单是能够显示更加详细信息的菜单子项 菜单子项使用了浮动窗体的显示形式,能够更好适应小屏幕的显示方式.android:id="@+id/entry" android:layout_height="wrap_content" android:layout_width="160dip“android:padding="3dip" ></EditText></TableRow> </TableLayout> 子菜单不支持嵌套,子菜单的添加是使用addSubMenu()函数实现.

快捷菜单---启动方式:快捷菜单类似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒后,将启动注册到该界面元素的快捷菜单

使用方法:与使用选项菜单的方法非常相似,需要重载onCreateContextMenu()函数和onContextItemSelected()函数;onCreateContextMenu()函数主要用来添加快捷菜单所显示的标题、图标和菜单子项等内容。 ContextMenu类支持add()函数和addSubMenu()函数,可以在快捷菜单中添加菜单子项和子菜单。

使用registerForContextMenu()函数,将快捷菜单注册到界面控件上。这样,用户在长时间点击该界面控件时,便会启动快捷菜单。

33.界面事件

按键事件:如果监听器处理函数的返回值为true,表示该事件已经完成处理过程,不需要其他处理函数参与处理过程,这样事件就不会再继续进行传递 ,反之,则继续传递。

触摸事件:原理----当手指接触到触摸屏、在触摸屏上移动或离开触摸屏时,分别会引发ACTION_DOWN、ACTION_UP和ACTION_MOVE触摸事件,而无论是哪种触摸事件,都会调用onTouch()函数进行处理 事件类型包含在onTouch()函数的MotionEvent参数中,可以通过getAction()函数获取到触摸事件的类型,然后根据触摸事件的不同类型进行不同的处理。为了能够使屏幕最上方的TextView处理触摸事件,需要使用setOnTouchListener()函数在代码中设置触摸事件监听器,并在onTouch()函数添加触摸事件的处理过程。

34.Android系统中的进程优先级由高到低 前台进程

可见进程:正在和用户交互的activity进程,被和用户交互的activity调用的进程;进程服务正在执行声明周期中的回调函数,如onCreate()、onStart()或onDestroy();进程的BroadcastReceiver正在执行onReceive()函数 可见进程:部分程序界面能够被用户看见,却不在前台与用户交互,不响应界面事件的进程。

服务进程:没有用户界面,在后台长期运行

后台进程:没有用户可见activity

空进程:没有活跃组件

35.Android系统有四个重要的组件,分别是Activity、Service、BroadcastReceiver(是用来接受并响应广播消息的组件,不包含任何用户界面 ,可以通过启动Activity或者Notification通知用户接收到重要信息)和ContentProvider(访问其他应用程序的私有数据)。

8

36.Activity生命周期

活动状态:Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互

暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互 停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡 非活动状态:不在以上三种状态中的Activity则处于非活动状态

Android知识总结

Android知识总结

onPause()是第一个被标识为“可终止”的函数,常用来保存持久数据,如界面上的用户的输入信息等. onSaveInstanceState()主要用来保存动态的状态信息,信息一般保存在Bundle中.

全生命周期------启动ActivityLifeCycle;按下模拟器的“返回键”;关闭ActivityLifeCycle

各回调函数的执行顺序:onCreate()----onStart()----onResume()---onPause()----onStop()----onDestroy() onCreate()完全生命周期开始时被调用,初始化Activity

onStart()可视生命周期开始时被调用,对用户界面进行必要的更改。

onRestoreInstanceState()在onStart()后被调用,用于恢复onSaveInstanceState()保存的用户界面信息 onResume()在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源

onSaveInstanceState()在onResume()后被调用,保存界面信息,保存Activity状态

onRestart()在重新进入可视生命周期前被调用,载入界面所需要的更改信息

onPause()在活动生命周期结束时被调用,用来保存持久的数据或释放占用的资源.停止对不可见Activity的更新

可视生命周期----启动ActivityLifeCycle;按“呼出/接听键”启动内置的拨号程序;再通过“返回键”退出拨号程序;ActivityLifeCycle重新显示在屏幕中

各回调函数的执行顺序onSaveInstanceState()→ onPause()→ onStop()→ onDestroy()→ onCreate()→ onStart()→ onRestoreInstanceState()→ onResume()

活动生命周期----启动ActivityLifeCycle;通过“挂断键”使模拟器进入休眠状态;再通过“挂断键”唤醒模拟器.执行顺序:onSaveInstanceState() → onPause() → onResume()

37.R.java文件是ADT自动生成的文件,包含对drawable、layout和values目录内的资源的引用指针,Android

9

程序能够直接通过R类引用目录中的资源

AndroidManifest.xml是XML格式的Android程序声明文件,包含了Android系统运行Android程序前所必须掌握的重要信息,这些信息包含应用程序名称、图标、包名称、模块组成、授权和SDK最低版本等,而且每个Android程序必须在根目录下包含一个AndroidManifest.xml文件

38.开放手机会支持Google 发布的Android 手机操作系统或者应用软件,共同开发名为Android 的开放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。

39.OHA是一个软硬件开发者组织。由OHA开发的Android?,是第一个完整的、开放的、免费的智能移动开发平台。

40.Android的系统架构

第一层---Linux 操作系统及驱动:内核提供系统核心服务,如进程、内存、电源管理,网络连接,驱动与安全等。

第二层-----本地框架和JAVA运行环境:库文件(媒体库,Web 浏览引擎,SQLite 关系数据库引擎等) 第三层----- Activity manager管理运行应用程序Content Provider在各应用之间共享数据Resource Manager管理非代码资源Notification Manager显示用户提示和状态栏Views System可扩展显示,可构建UI

充分访问所有核心应用框架API;简化组件的重用;用Java 编写应用程序

第四层----JAVA应用程序

41.三种层次开发

系统级开发:改造Android底层核心,改善底层基础库和构造块(需要在Linux UBuntu上进行)

Android移植:将Android系统移植到特定的硬件平台,修改某些驱动层和原生应用程序(比如Home程序)(需要在Linux UBuntu上进行)

Android应用开发:基于标准的Android运行时库和标准的应用开发SDK完成的应用程序(可以在Windows,MacOS和Linux上进行

42.Dalvik和标准Java虚拟机(JVM)首要差别

Dalvik 基于寄存器,而JVM 基于栈。

基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。

Dalvik和Java运行环境的区别

Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,

每一个Dalvik 应用作为一个独立的Linux 进程执行。

独立进程可防止在虚拟机崩溃的时候所有程序都被关闭。

Dalvik 提供一个拥有较少限制许可证的平台。

43.常见的移动终端及系统:PDA,掌上电脑,导航产品与谷歌地图,手机,录音笔

10

相关推荐