嵌入式系统基础资料.ppt_第1页
嵌入式系统基础资料.ppt_第2页
嵌入式系统基础资料.ppt_第3页
嵌入式系统基础资料.ppt_第4页
嵌入式系统基础资料.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android 重要对象,Android应用程序由下列组件组成: Activity Service Intent Broadcast Receiver Content Provider,Activity 活动,是Android应用程序中使用频率最高、最基本的组件。 一个Activity对应一个单独的UI。 活动界面加载在onCreate()方法执行时进行 常使用setContentView(int)来设置界面。 里面的int值使用R.layout.xxx来指向layout文件夹下的布局文件xxx。 也可以使用setContentView(view)来设置活动界面,参数是实例化的view子类,A

2、ctivity类位于android.app包中,定义其子类需要在子类前使用“import android.app.Activity; ”。 每一个Activity必须在Androidmanifest.xml文件中声明。 申明方法: ,Activity 活动,任务 组件的动态运行,有一个最与众不同的概念 - 任务 任务(Task): 完成用户的一个目的的所有Activity 。 任务栈(Task Stack): 任务以一组栈的模式,将这些Activity组件聚集在一起的集合。 Android系统用一个任务栈来记录一个任务。,任务 以收发邮件任务为例:,进程 进程是低级核心处理过程,用于运行应用程

3、序代码。 在Android操作系统中,进程完全是应用程序的具体实现。 组件运行的进程由Androidmanifest文件控制。 组件标签, , 和包含一个process属性,这个属性可以设置组件运行的进程。 标签也包含process属性,用来设置程序中所有组件的默认进程。 所有的组件在默认进程的主线程中实例化,系统对这些组件的调用从主线程中分离。,进程分类 前台进程:正在前台运行的进程。 前台进程是必须的用户操作。 前台进程包括: 正运行着的,与用户交互的Activity。 正运行着的Activity所使用的一个Service。 服务。正在执行回调方法(如onStart()、onCreate(

4、)或 onDestroy()的Service对象。 正在执行onReceive()方法的BroadcastReceiver对象。 一般情况下,前台进程不会被“杀死”。,进程分类 可见进程:在屏幕中显示,但用户没有直接与之进行交互。 可见进程为用户在屏幕上可见但不能与用户进行交互的进程。 可见进程包括: 一个不在前台但为用户可见的Activity(如在调用了方法onPause() 之后)。 一个可视的Activity所绑定的Service。 可见进程很重要,不到极端情况(如无法维持前台进程运行时),不会“销毁”可见进程。,进程分类 服务进程:不可见,在后台为用户服务; 一般不会被中断。 服务进程

5、包括: 一个由startService()方法启动的Service。 支持正在处理的不需要可见界面运行的Service。 因为服务不是直接和用户打交道,它的优先级稍低于可见的活动。系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。,进程分类 后台进程:对用户作用不大,可能会被系统中止。 后台进程包括: 目前不可见的Activity(即已调用了onStop()方法)。 目前没有服务的Service。 在一般情况下会有大量的后台进程,Android将会使用last-seen-first-killed模式来“杀死”进程来为前台进程获得资源。,进程分类 空进程:对用户没有任

6、何作用,是首先被中止的进程。 为了改善系统的整体性能, Android通常在内存中保留生命周期结束了的应用。 Android使用这种缓存机制能够减少应用程序在再次启动时所需的启动时间。这些过程通常根据需要被杀死。,线程 每个进程有一到多个线程运行在其中。 进程中的所有组件都在UI线程中实例化,以保证应用程序是单线程的。 线程通过java的标准对象Thread 创建。 永远要记住: 不要阻塞UI线程!如果在UI线程中执行阻塞或者耗时操作会导致UI线程无法响应用户请求。 不能在非UI线程(也称为工作线程)中更新UI!这是因为android的UI控件都是线程不安全的。,应用程序生命周期: 应用程序生

7、命周期指从创建到结束的全过程。 Android 应用程序的生命周期是由Android 框架进行管理,而不是由应用程序直接控制。 每个应用的内存和进程都是由进行时独立管理的。 每个Android的应用程序在自己的进程中运行。 应用程序组件有其生命周期:由Android初始化它们,以相应Intent响应意图,直到结束,实例被销毁。 Activity类是Android应用生命周期的重要部分之一。,Activity的生命周期: Activity被一个Activity栈管理。堆栈中保存对象的实例,在一个任务中可能存在多个同一Activity的实例。 生命周期中的五种状态:启动,运行,暂停,停止,销毁。

8、启动:Activity被压入栈顶。 运行:Activity可见并获得焦点,与用户进行交互。 暂停:Activity可见但失去焦点。 停止:Activity被另一个Activity完全覆盖,不可见,系统可以随时将其释放。 销毁:系统将Activity从内存中删除,Activity被弹出出栈。,Activity的生命周期状态转变,(“*”号表示可选,可能被执行,也可不被执行),Activity 生命周期事件处理函数 onCreate(Bundle): 首先创建时调用该方法。 执行一次性的初始化工作。 提供Bundle参数 如果Activity之前是被冻结状态,其状态由Bundle提供。 接受参数为

9、null或由onSaveInstanceState()方法保存的状态信息。 其后调用onStart()或onRestart()方法。 onStart(): 当Activity对用户即将可见时调用。 onResume(): 用户可以开始与活动进行交互时会调用该方法。,Activity 生命周期事件处理函数 onPause(): 活动将进入后台时会运行该方法。 onStop(): 在一段时间内不需要某个活动时,调用该方法。 onRestart(): 将已处于停止状态的活动重新显示给用户。 onDestroy(): 销毁活动前调用该方法。 如果内存不足,系统会终止进程,可能不需要调用该方法。,Act

10、ivity 生命周期事件处理函数 onSaveInstanceState(Bundle): 调用该方法让活动可以保存每个实例的状态。 onRestoreInstanceState(Bundle): 使用onSaveInstanceState()方法保存的状态来重新初始化某个活动时调用该方法。,例子,活动的生命周期,上课演示,界面状态 一个Activity被激活并运行,即为建立了一个Activity的实例。 Activity实例与用户交互,产生界面状态信息。如用户所选取的值,光标的位置等。 当Activity实例进入“暂停”或“停止”状态时,需要保存这些临时的状态信息。 保存状态信息的方法: S

11、haredPreferences对象。 Bundle对象。 二者使用方法在数据存储时介绍,使用activity时注意以下问题: 当我们的活动在调用onPause()时,如果用户需要保存数据,应该在此时保存。当然你也可以使用onSaveInstanceState(Bundle)来保存,但是该方法不是活动声明周期的必须方法,不能保证一定被调用。 保存的数据在onCreate(Bundle) 可以重新载入。 当我们在一个应用程序里自己创建活动时,需要再Androidmanifest.xml文件中注册改活动,具体位置在之间。 ,使用activity时注意以下问题: Activity类位于android

12、.app包中,定义其子类需要在子类前使用“import android.app.Activity; ”。 启动活动 当无需返回数据时,使用startActivity(intent)即可 当需要在启动的子活动结束时给主活动返回数据时,使用startActivityForResult(intent)来返回数据。子活动使用setResult(RESULT_OK, intent)返回数据。主活动使用onActivityResult(int requestCode, int resultCode, Intent data) 来获得返回数据。 结束活动 调用Finish() 方法即可,Intent对象 I

13、ntent是连接应用程序的三个核心组件Activity、Service和BroadcastReceiver的桥梁。完成组件之间的调用,在组件之间传递信息。 Intent负责对应用中操作的动作、动作涉及数据及附加数据进行描述。 Intent本身是一个Intent类对象, Intent类都定义在android.content.Intent中。 Intent对象由组件名称、Action、Data、Category、Extra及Flag六部分组成。,Intent对象 组件名称:要处理该Intent的组件名称。 设置组件名,该intent对象将被传递给组件名指定的类。 如果省略组件名,则在Android

14、manifest中,通过使用IntentFilter 来找与Intent最合适的组件。 setComponent()方法:设置组件名。 getComponent()方法:读取组件名。 行动(Action):一个字符串,用于命名要采取的行动。,Intent对象 数据(Data): 执行动作要操作的数据,用指向数据的一个URI来表示。 例如,指向某联系人的URI为:content:/contacts/1,以下是action/data对:,Intent对象 类别(category) 被执行动作的附加信息。 数据类型(type) 强制指定数据的类型。 附加信息(extras) 其他所有附加信息的集合。

15、 标志(flag) 指导Android系统启动一个Activity以及Activity启动后对其进行处理。,Intent分类,Intent有直接意图(Explicit Intents)和间接意图( Implicit Intents )两种方式 直接意图 指定了要调用的组件,一般用在应用程序的内部,或者明确知道组件的名 Intent i = new Intent(this, ActivityTwo.class); i.putExtra(Value1, This value one for ActivityTwo ); i.putExtra(Value2, This value two Activ

16、ityTwo); 间接意图 没有指定具体 组件,这些Intent包含足够的信息,系统根据这些信息,在所有的可用组件中,确定满足此Intent的组件。 Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(); startActivity(i);,Intent过滤器 活动、服务、广播接受者为了告知系统能够处理哪些间接意图,它们使用意图过滤器(Intent filter)。 每个过滤器描述了该组件的能力,指明了能够接收那些意图、过滤那些意图(这些意图一般是间接的,直接意图带有明确) 过滤时依靠三个条件,动作(action)、类型(category)

17、和数据(data)。数据包含数据类型(data type)、数据格式(data scheme)、数据权限(data authority)、路径(data path)。 Intent过滤器是在manifest文件中进行声明。,意图传递动作和数据 向Intent中加入数据时使用的putExtra() 。这些数据是以键值对(key/value)的形式出现。Key是String类型,value可以是int,string 等多种类型。 接收者通过getAction()方法可以得到动作,通过 getData()方法可以得到数据,通过getIntent()方法可以检索原始Intent(以便获得数据),比如

18、Bundle bunde = this.getIntent().getExtras();,例子,传递与接收数据 传送 Intent intent = new Intent(Intent.ACTION_SEND); intent.setType(text/plain); intent.putExtra(android.content.Intent.EXTRA_TEXT, News for you!); startActivity(intent);,应用程序接收数据 Bundle extras = getIntent().getExtras(); if (extras = null) return

19、; / Get data via the key String value1 = extras.getString(Intent.EXTRA_TEXT); if (value1 != null) / Do something with the data ,使用Intent可以启用活动、服务组件 1启动活动 (1)启动新活动,在现有组件使用startActivity(Intent),如果返回原活动还需要使用该方法。 (2)启动新活动,并向原组件返回数据时,在原活动中使用startActivityForResult() 获得返回数据。这样新活动也叫子活动(Sub-Activity) 当子活动结束时

20、( finish()被调用时),它使用setResult(RESULT_OK, intent)向原活动传递数据。 当子活动结束(finished),原活动可以调用onActivityResult()获得子活动返回的数据。 2启动服务 startService(intent);,打电话 intent= new Intent(Intent.ACTION_CALL, Uri.parse(tel:(+86)10086); 拨号 intent = new Intent(Intent.ACTION_DIAL, Uri.parse(tel:(+86)10086); 启动发短信界面 intent = new

21、Intent(Intent.ACTION_VIEW); intent.putExtra(sms_body, The SMS text); intent.setType(vnd.android-dir/mms-sms); 给某人发短信 intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(smsto:10086); intent.putExtra(“sms_body”, “The sms message”); 上网 intent = new Intent(Intent.ACTION_VIEW,Uri.parse(); 启动照相机 intent =

22、 new Intent(android.media.action.IMAGE_CAPTURE); Break;,例子,直接Intent,startActivity()方法,public class Activity01 extends Activity public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.button1); butto

23、n.setOnClickListener(new Button.OnClickListener() public void onClick(View v) Intent intent = new Intent(); intent.setClass(Activity01.this, Activity02.class); startActivity(intent); Activity01.this.finish(); );,例子,直接Intent,有返回数据,public class Act1 extends Activity private static final int REQUEST_CO

24、DE = 10; private TextView text; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main_act1); text=(TextView)findViewById(R.id.textView1); public void onClick(View view) Intent i = new Intent(this, Act2.class); i.putExtra(Value1,

25、get data1 by Intent); i.putExtra(Value2, get date2 by Intent); startActivityForResult(i, REQUEST_CODE); Override protected void onActivityResult(int requestCode, int resultCode, Intent data) if (resultCode = RESULT_OK ,public class Act2 extends Activity Override protected void onCreate(Bundle bundle

26、) super.onCreate(bundle); setContentView(R.layout.main_act2); Bundle extras = getIntent().getExtras(); if (extras = null) return; String value1 = extras.getString(Value1); String value2 = extras.getString(Value2); if (value1 != null ,public class IntentCall extends Activity /* Called when the activi

27、ty is first created. */ private Button bt1; private Button bt2; private EditText et1; private EditText et2; private String strSms; private String strPhone; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); bt1=(Button)findView

28、ById(R.id.button1); bt2=(Button)findViewById(R.id.button2); et1=(EditText)findViewById(R.id.editText1); et2=(EditText)findViewById(R.id.editText2); bt1.setOnClickListener(new OnClickListener() public void onClick(View view) / TODO Auto-generated method stub strSms=et1.getText().toString(); strPhone=

29、et2.getText().toString(); Uri uri=Uri.parse(smsto:+strPhone); Intent intent=new Intent(); intent.putExtra(sms_body, strSms); intent.setAction(Intent.ACTION_SENDTO); intent.setData(uri); startActivity(intent); ); bt2.setOnClickListener(new OnClickListener() public void onClick(View v) / TODO Auto-gen

30、erated method stub strSms=et1.getText().toString(); strPhone=et2.getText().toString(); Uri uri=Uri.parse(tel:+strPhone); Intent intent=new Intent(Intent.ACTION_CALL,uri); startActivity(intent); ); , ,服务(service),服务是android系统的重要组件之一,在后台长时间运行与用户无交互界面,可以与其他组件交互,可以进程间通信(interprocess communication)。比如服务可

31、以处理网络传输、播放音乐、接口操作,与内容提供者交互等长时间运行在后台的,都是服务组件。 服务开始有有启动(started)和绑定(bound)两种方式,无论哪种方式我们都需要使用意图(Intent)来传递信息。 当使用startService()方法调用时,称之为启动。服务启动后一直运行(即使启动它的活动生命周期已经结束),需要一定的方法销毁(stopService())。被启动的服务完成独自的操作,对调用者来说没有返回结果。 当应用程序调用bindService()方法时,称之为绑定。绑定的服务提供客户端服务接口,允许启动它的组件与之交互,比如发送请求、得到请求,还可能使用进程间通信来完成

32、跨进程操作。多个组件可以绑定一个服务,当所有的组件解绑后,这个服务结束。 服务和活动一样,使用时需要在Androidmanifest.xml中注册。 ,package .mytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class Activity1 extends Activity Button btn1; Button btn2;

33、 Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1=(Button)findViewById(R.id.button1); btn2=(Button)findViewById(R.id.button2); btn1.setOnClickListener(new Button.OnClickListener() Override public void onClick(View v) / T

34、ODO Auto-generated method stub Intent intent=new Intent(); intent.setClass(Activity1.this, Activity2.class); startService(intent); ); btn2.setOnClickListener(new Button.OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub Intent intent=new Intent(); intent.setClas

35、s(Activity1.this, Activity2.class); stopService(intent); ); ,package .mytest; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; public class Activity2 extends Service private MediaPlayer player; public IBinder onBind(Intent arg0)

36、return null; public void onStart(Intent intent,int startId) super.onStart(intent, startId); player=MediaPlayer.create(this, R.raw.mymusic); player.start(); public void onDestroy() super.onDestroy(); player.stop(); ,Androidmanifest.xml ,服务的生命周期,活动的生命周期始于startService()或bindService() 如果Service还没有运行,则an

37、droid先调用onCreate(),然后调用onStart(); 如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 onBind(只一次,不可多次绑定),Android的系统服务,Android内部有许多系统服务,我们要得到这些服务时可以使用Activity类的getSystemService方法获得指定的系统服务。 getSystemService方法只有一个String类型的参数,表示系统服务的ID,这个ID在整个Android系统中是唯一的。例如,audio表示音频服务,window表示窗口服务,notificati

38、on表示通知服务。android.content.Context类中定义了这些ID,详细信息可以自己查阅。 getSystemService(Context.CLIPBOARD_SERVICE); 获得剪贴板内容 getSystemService(Context.WINDOW_SERVICE);获得窗口宽度 getSystemService(Context.TELEPHONY_SERVICE); 获得电话服务 例子略去,Content Providers,ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的

39、形式来组织数据。 使用ContentProvider可以在不同的应用程序之间共享数据。这也是跨应用共享数据的唯一方式。在android系统中,没有一个公共的内存区域,供多个应用共享存储数据。,每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。格式如下: A:标准前缀 B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。 C:数据表名 D:数据ID URI的形式通常有两种,一种是指定全部数据,另一种是指定某个ID的

40、数据。 content:/contacts/people/这个Uri指定的就是全部的联系人数据。 content:/contacts/people/1这个Uri指定的是ID为1的联系人的数据。,Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。应用程序可以获得这些Contentprovider,查询它们包含的数据,在读取时应用程序需要有一定的权限。 比如获得读取通讯录的权限,需要在Manifest.xml中注册 ,外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过

41、getContentResolver()可以得到当前应用的ContentResolver实例。 ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个: query(Uriuri,Stringprojection,Stringselection,StringselectionArgs,StringsortOrder)通过Uri进行查询,返回一个Cursor。 insert(Uriurl,ContentValuesvalues):将一组数据插入到Uri指定的地方。 update(Uriuri,ContentValuesvalues,Strin

42、gwhere,StringselectionArgs):更新Uri指定位置的数据。 delete(Uriurl,Stringwhere,StringselectionArgs):删除指定Uri并且符合一定条件的数据。 在实际应用中自己创建ContentProvider并不多,如果需要自己创建contentprovider,那么自定义的类要继承ContentProvider类。,例子读取通讯录的内容 Manifest.xml中注册 ,public class ObtainContact extends Activity Override public void onCreate(Bundle savedI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论