Activity、Intent和Service系统结构设计.ppt_第1页
Activity、Intent和Service系统结构设计.ppt_第2页
Activity、Intent和Service系统结构设计.ppt_第3页
Activity、Intent和Service系统结构设计.ppt_第4页
Activity、Intent和Service系统结构设计.ppt_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

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

文档简介

,第13章Activity、Intent和Service系统结构设计,目录,13.1Java语言编程基础13.2Android应用程序组件13.3Activity13.4Intent13.5Service13.6对话框13.7Android程序命周期13.8广播接收器13.9Android网络编程,13.1Java语言编程基础,java中的package与import,package名称就像是我们的姓,而class名称就像是我们的名字。package名称有很多.的,就好像是复姓。比如说java.lang.String,就是复姓java.lang,名字为String的类别;java.io.InputStream则是复姓java.io,名字为InputStream的类别。,Java会使用package这种机制的原因也非常明显,就像我们取姓名一样,在一所学校的同一届同学中,就有可能会出现不少同名的同学,如果不取姓的话,那学校在处理学生数据,或是同学彼此之间的称呼,就会发生很大的困扰。相同的,全世界的Java类别数量,还在不断的成长中,如果类别不使用套件名称,那在用到相同名称的不同类别时,就会产生极大的困扰。,很多套件的名称非常的长,在写程序时会多输入很多字,花费不少时间,比如说:java.io.InputStreamis=java.lang.System.in;java.io.InputStreamReaderisr=newjava.io.InputStreamReader(is);java.io.BufferedReaderbr=newjava.io.BufferedReader(isr);,这个import就是在程序一开头的时候,先说明程序中会用到那些类别的简称,也就是只称呼名字,不称呼他的姓。首先,在开头写:importjava.lang.System;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.BufferedReader;,这几行说明了这四个姓名的类别,在程序中只用他的名字来称呼,所以当程序中提到System就是指java.lang.System,而InputStream就是指java.io.InputStream,依此类推。于是原来的程序就变成:InputStream=System.in;InputStreamReaderisr=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(isr);,如果这些类别用的次数很多,那就更能体会到import的好处了。可这样还是不够,还是会有人觉得打太多import也很浪费时间,于是Sun又提供了一个方法:importjava.lang.*;importjava.io.*;意思是,等一下程序中提到的没有姓名的类别,不是姓java.lang,就是姓java.io,如果这两个里面有同样名字的类别,而不幸的你又只用名字称呼这个类别,那编译器仍然会跟你抱怨,因为它还是不知道你说的这个类别指那一个姓的类别。,C+和Java的区别,C+和Java都是面向对象的语言,也就是说,它们都能够实现面向对象的思想(封装,继承,多态)。C+和Java的相似之处多于不同之处。区别大致可以分为三类:Java不支持的C+特性C+不支持的Java特性C+和Java都有但是却不相同的特性,Java不支持的C+特性,C+与Java之间的最大不同可能是Java不支持指针;Java不包含结构或者联合;Java不支持操作符重载;Java不包括预处理,也不再支持预处理指令;Java不支持自动的类型转换;Java中不包含全局变量或全局函数;Java不支持多重继承,即不允许一个子类继承多个父类;,Java不允许默认参数。在C+中,当过程调用时存在没有对应值的参数时可以使用一个预先指定的值。Java不允许这样的操作;虽然Java支持构造函数,但不支持析构函数。但是,Java增加了finalize()函数;Java不支持typedef;Java不支持goto语句;Java没有delete操作符;Java中的不再重载I/O操作;Java中,参数传递的方式只能是传值,C+中可以传值、传指针或传引用;等等,C+不支持的Java特性,最重要的方面是:包接口,C+和Java都有但是却不相同的特性,Java和C+都支持布尔类型的数据,但Java实现true和false的方式和C+不同。在C+中,true是非零值,false是零;在Java中,true和false都是预先定义好的常量,而且是一个布尔表达式能得到的惟一的两个值。虽然C+也定义了true和false,并指定为布尔变量,但C+自动将非零值转换为true,零值转换为false。这种情况在Java中不会出现。在创建C+类时,标识符可以应用到一组声明中。而Java中,标识符仅应用于其限定的声明中。C+支持异常处理,这与Java类似。等等,13.2Android应用程序组件,13.3Activity,13.3.1Activity类,HelloWorld类继承自Activity且重写了onCreate方法。Activity是用户唯一可以看得到的东西。几乎所有的activity都与用户进行交互,所以Activity主要负责的就是创建显示窗口,可以在这些窗口里使用setContentView(View)来显示自己的UI。activity展现在用户面前的经常是全屏窗口,也可以将activity作为浮动窗口来使用(使用设置了windowIsFloating的主题),或者嵌入到其他的activity(使用ActivityGroup)中。下面是两个几乎所有Activity的子类都实现了的方法。,hello类源程序,packagecom.android.hello;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;importandroid.view.Gravity;importandroid.widget.ImageView;,publicclasshelloextendsActivity/*在第一次创建Activity时调用.*/OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);Buttonbutton=(Button)findViewById(R.id.button1);button.setOnClickListener(newView.OnClickListener(),/OverridepublicvoidonClick(Viewv)EditTextedit1=(EditText)findViewById(R.id.edit1);Toasttoast=Toast.makeText(getApplicationContext(),我们的临时对话框!,Toast.LENGTH_LONG);toast.setGravity(Gravity.CENTER,0,0);toast.show(););,onCreate(Bundle)这个方法是初始化activity的地方.最重要的是,经常需要在这里使用setContentView(int)来设置UI布局所使用的layout资源,当需要使用程序控制UI中的组件时可以使用findViewById(int)来获得对应的视图。当用户离开activity时可以在onPause()进行相应的操作.更重要的是,用户做的任何改变都应该在该点上提交(经常提交到ContentProvider这里保存数据)。,如果要使用Context.startActivity()来启动activity.activity都必须在启动者应用包的AndroidManifest.xml文件中有对应的定义。,13.3.2Android事件侦听器,1.Android事件侦听器介绍,Android事件侦听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的侦听器被用户界面操作触发时由Android框架调用。回调方法被包含在Android事件侦听器接口中。例如,Android的view对象都含有一个命名为OnClickListener接口成员变量,用户的点击操作都会交给OnClickListener的OnClick()方法进行处理。,开发者若需要对点击事件做处理,可以定义一个OnClickListener接口对象,赋给需要被点击的view的接口成员变量OnClickListener,一般是用view的setOnClickListener()函数来完成这一操作。当有用户点击事件时,系统就会回调被点击view的OnClickListener接口成员的OnClick()方法。,Java回调函数,所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。WebService以及Java的RMI都用到回调机制,可以访问远程服务器程序。,下面举个通俗的例子:,某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其他事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。通过上面个人感觉到回调更多的应用就是结合异步。比如:Ajax中js通过组件和服务器的异步通信。,例:,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C+中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。假设我是程序员A,以下是我的程序a:,publicclassCallerpublicMyCallInterfacemc;publicvoidsetCallfuc(MyCallInterfacemc)this.mc=mc;publicvoidcall()this.mc.method();,我还需要定义一个接口,以便程序员B根据我的定义编写程序实现接口。,publicinterfaceMyCallInterfacepublicvoidmethod();,于是,程序员B只需要实现这个接口就能达到回调的目的了:,publicclassBimplementsMyCallInterfacepublicvoidmethod()System.out.println(回调);publicstaticvoidmain(Stringargs)Callercall=newCaller();call.setCallfuc(newB();call.call();,2.Android事件监听器接口中常用的回调方法,(1)onClick()包含于View.OnClickListener。当用户触摸这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后按下“确认”键或者按下跟踪球时被调用。,(2)onLongClick(),包含于View.OnLongClickListener。当用户触摸并控制住这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后保持按下“确认”键或者按下跟踪球(一秒钟)时被调用。,(3)onFocusChange(),包含于View.OnFocusChangeListener。当用户使用浏览键或跟踪球浏览进入或离开这个item时被调用。,(4)onKey(),包含于View.OnKeyListener。当用户聚焦在这个item上并按下或释放设备上的一个按键时被调用。,(5)onTouch(),包含于View.OnTouchListener。当用户执行的动作被当做一个触摸事件时被调用,包括按下,释放,或者屏幕上任何的移动手势(在这个item的边界内)。,(6)onCreateContextMenu(),包含于View.OnCreateContextMenuListener。当正在创建一个上下文菜单的时候被调用(作为持续的“长点击”动作的结果)。,packagecom.android.hello;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;importandroid.view.Gravity;importandroid.widget.ImageView;publicclasshelloextendsActivity/*Calledwhentheactivityisfirstcreated.*/OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);ImageViewimg=(ImageView)findViewById(R.id.login_btn);img.setOnClickListener(newView.OnClickListener()/OverridepublicvoidonClick(Viewv)EditTextusername=(EditText)findViewById(R.id.username_et);EditTextpassword=(EditText)findViewById(R.id.password_et);Stringstr=;if(username.getText().toString().equals(admin),3.Listener使用方法,Listener在使用上有多种写法,例如:方法1:其中的this相当于newOnClickListener()对象,即classtest中的一个对象,而如果要用这种方式的话,publicvoidonClick方法必须写在该test类中,且在开头使用implementsOnClickListener,即this对象可以直接调用该方法:m_button1.setOnClickListener(this);,方法2:使用对象clickListener:m_button2.setOnClickListener(clickListener);,方法3:使用匿名对象创建监听,同方法2,可以看作另一种写法:m_button3.setOnClickListener(newButton.OnClickListener()OverridepublicvoidonClick(Viewv)StringstrTmp=点击Button03;ET.setText(strTmp););,方法4:使用XML文件创建时绑定方法Btn4OnClick。例如:,方法5:自己设计个监听类,监听的方法引用OnClickListener接口中的方法,创建的是匿名对象:m_button5.setOnClickListener(newclickListener2();,方法6:外部类实现事件监听器接口,很少用,方法如下:m_button6.setOnClickListener(newcallOut(this);,4.Listener使用方法实例,(1)1、main.xml文件代码如下:,(2)javay文件代码如下:,packagecom.android.hello;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;importandroid.view.Gravity;importandroid.widget.TextView;importandroid.view.View.OnClickListener;importandroid.util.Log;publicclasshelloextendsActivityimplementsOnClickListenerprivateButtonm_button1,m_button2,m_button3,m_button4,m_button5,m_button6;publicTextViewtv;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);tv=(TextView)findViewById(R.id.tvTitle);m_button1=(Button)findViewById(R.id.button1);m_button2=(Button)findViewById(R.id.button2);m_button3=(Button)findViewById(R.id.button3);/xml绑定button,android:onClick=Btn4OnClick/m_button4=(Button)findViewById(R.id.button4);m_button5=(Button)findViewById(R.id.button5);m_button6=(Button)findViewById(R.id.button6);/*方法1,参数this相当于newOnClickListener()对象*/m_button1.setOnClickListener(this);/方法2,使用对象clickListenerm_button2.setOnClickListener(clickListener);/方法3,使用匿名对象创建监听,同方法2,可以看作另一种写法m_button3.setOnClickListener(newButton.OnClickListener()OverridepublicvoidonClick(Viewv)StringstrTmp=点击Button03;tv.setText(strTmp););/方法4,使用XML文件创建时绑定方法Btn4OnClick/方法5,自己设计个监听类m_button5.setOnClickListener(newclickListener2();/方法6,外部类实现事件监听器接口,详看文件callout.javam_button6.setOnClickListener(newcallOut(this);OverridepublicvoidonClick(Viewv)Log.i(log,click);StringstrTmp=点击Button01;tv.setText(strTmp);publicOnClickListenerclickListener=newOnClickListener()OverridepublicvoidonClick(Viewv)StringstrTmp=点击Button02;tv.setText(strTmp);publicvoidBtn4OnClick(Viewview)StringstrTmp=点击Button04;tv.setText(strTmp);publicclassclickListener2implementsView.OnClickListenerOverridepublicvoidonClick(Viewv)StringstrTmp=点击Button05;tv.setText(strTmp);publicclasscallOutimplementsOnClickListenerprivatehelloact;publiccallOut(Activityactivity)act=(hello)activity;OverridepublicvoidonClick(Viewv)StringstrTmp=点击Button06;act.tv.setText(strTmp);,(3)callOut文件,callOut类是一个外部类实现事件监听器接口,实现代码如下:,packagecom.mypack;importandroid.app.Activity;importandroid.view.View;importandroid.view.View.OnClickListener;importcom.mypack.Button4Activity;publicclasscallOutimplementsOnClickListenerprivateButton4Activityact;publiccallOut(Activityactivity)act=(Button4Activity)activity;OverridepublicvoidonClick(Viewv)StringstrTmp=点击Button06;act.ET.setText(strTmp);,13.4Intent,13.4.1Intent介绍,Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。,在SDK中给出了Intent作用的表现形式为:,通过Context.startActivity()或Activity.startActivityForResult()启动一个Activity;通过Context.startService()启动一个服务,或者通过Context.bindService()和后台服务交互;通过广播方法(比如Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast()发给广播接收者。,13.4.2常见Intent应用,1.显示网页,Uriuri=Uri.parse();Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);,2.显示地图,Uriuri=Uri.parse(geo:38.899533,-77.036476);Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);/其他geoURI例子/geo:latitude,longitude/geo:latitude,longitude?z=zoom/geo:0,0?q=my+street+address/geo:0,0?q=business+near+city/google.streetview:cbll=lat,lngIntentit=newIntent(Intent.ACTION_DIAL,uri);startActivity(it);/直接打电话出去Uriuri=Uri.parse(tel:0800000123);Intentit=newIntent(Intent.ACTION_CALL,uri);startActivity(it);/用這個,要在AndroidManifest.xml中,加上/,5.传送SMS/MMS,/调用短信程序Intentit=newIntent(Intent.ACTION_VIEW,uri);it.putExtra(sms_body,TheSMStext);it.setType(vnd.android-dir/mms-sms);startActivity(it);/传送消息Uriuri=Uri.parse(smsto:/0800000123);Intentit=newIntent(Intent.ACTION_SENDTO,uri);it.putExtra(sms_body,TheSMStext);startActivity(it);,6.传送Email,Uriuri=Uri.parse(mailto:xxx);Intentit=newIntent(Intent.ACTION_SENDTO,uri);startActivity(it);Intentit=newIntent(Intent.ACTION_SEND);it.putExtra(Intent.EXTRA_EMAIL,me);it.putExtra(Intent.EXTRA_TEXT,Theemailbodytext);it.setType(text/plain);startActivity(Intent.createChooser(it,ChooseEmailClient);,7.播放多媒体,Uriuri=Uri.parse(file:/sdcard/song.mp3);Intentit=newIntent(Intent.ACTION_VIEW,uri);it.setType(audio/mp3);startActivity(it);Uriuri=Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,1);Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);,13.4.3两个activity之间切换举例,(1)在Activity01中设置一个可触发的空间,并添加一个触发器。(2)在Activity01的触发器添加listener。(3)在Activity01文件中加入Intent包:importandroid.content.Intent;,(4)listener接口实现结尾,通过Activity01启动调用这个Intent对象,通过调用来切换到Activity02,例如:Intentintent=newIntent(Activity01.this,Activity02.class);,(5)在Activity01的listener接口实现中,设置一个Intent,让这个Intent能够将Activity01和Activity02绑定起来,并且通过putExtra将要传输的值放到Intent对象中存储,例如:PersonmPerson=newPerson();mPerson.setAge(20);mPerson.setName(moon);Bundlebundle=newBundle();bundle.putSerializable(person,mPerson);intent.putExtras(bundle);,(6)在Activity01中启动新的Activity,例如:startActivity(intent);,(7)在Activity02中,使用getIntent来获取上下文切换中使得自己启动了的那个Intent对象实例。(8)通过获取到的intent对象实例,使用起getStringExtra来获取先前putExtra的值,例如:Personperson=(Person)getIntent().getSerializableExtra(person);,(9)在AndroidManifest.xml文件中添加新的active.,13.5Service,13.5.1Service介绍,Android支持服务的概念。服务是在后台运行组件,没有用户界面。可以将这些组件想象为Windows服务或UNIX服务。与这些服务类型类似,Android服务始终可用,但无需主动执行某些操作。Android支持两种服务类型的服务:本地服务和远程服务。本地服务无法供在设备上运行其他应用程序访问。一般而言,这些服务类型仅支持承载该服务的应用程序。而对于远程服务,除了可以承载服务的应用程序访问,还可以从其他应用程序访问。远程服务使用AIDL(AndroidInterfaceDefinitionLanguage,Android接口定义语言)向客户端定义其自身。,Service是android系统中的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之一,它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。Service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台。,13.5.2Service启动流程,context.startService()启动流程如下:context.startService()-onCreate()-onStart()-Servicerunning-context.stopService()-onDestroy()-Servicestop,13.6对话框,13.6.1Toast消息提示框,Toasttoast=Toast.makeText(getApplicationContext(),默认的Toast,Toast.LENGTH_SHORT);/显示toast信息toast.show();,13.6.2对话框,Android对话框有如下几种类型:(1)AlertDialog:它能够管理0个1个2个3个按钮和一个包含radio或者checkbox的可选项列表。(2)ProgressDialog:一个用于显示进度圈或者进度条的dialog,继承自AlertDialog,所以它也支持按钮。(3)DatePickerDialog:用于让用户选择日期的dialog。(4)TimePickerDialog:用于让用户选择时间的dialog。如果需要定义自己的dialog,只需要继承dialog或者上面提到四个组件之一,并且为新的dialog定义自己的布局就可以了。,AlertDialog对话框实例,protectedvoiddialog()AlertDialog.Builderbuilder=newBuilder(Main.this);builder.setMessage(“确认退出吗?”);builder.setTitle(提示);builder.setPositiveButton(确认,newOnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)dialog.dismiss();Main.this.finish(););,builder.setNegativeButton(取消,newOnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)dialog.dismiss(););builder.create().show();,13.7Android程序命周期,1.Android程序命周期,与大多数传统的操作系统环境不同,Android应用程序并不能控制自己的生命周期。所以应用的各个组件(activity,Service)就得时刻小心的监听应用的状态变化对它们的影响,防止在不适当的时机被终止掉。在Android中每个应用都具有独立的进程运行在独立的Dalvik(Android特有的虚拟机)。各个应用在运行时的进程管理和内存管理都是相对独立的。Android使用一种“侵占性”的方式管理系统资源,这意味着为了释放资源给高优先级的程序(通常情况下是正在与用户进行直接交互的程序),某些进程及其宿主程序将会在没有任何提示警告的情况下被无情的结束。,2.理解应用的优先级和进程状态,结束一些进程是为了释放回收资源,那么那些进程会被结束?是A先结束还是B先结束呢?这决定于宿主应用程序的优先级了。一个应用的优先级等同于具有最高优先级的组件的优先级。如果此刻两个程序具有相同的优先级,那么曾经哪个进程处于低优先级的时间较长,就会被结束掉。进程的优先级受到进程间附属关系的影响,比如A应用依赖的Service或者ContentProvider是由B应用提供的,那么B将会具有更高的优先级。所有的Android应用都会遗留在内存中运行,直到系统需要释放回收资源才会被结束掉。,3.Activity状态,Activity有三种基本状态:Active:处于屏幕前景(当前task的栈顶Activity处于Active状态),同一时刻只能有一个Activity处于Active状态;Paused状态:处于背景画面画面状态,失去了焦点,但依然是活动状态;stopped:不可见,但依然保持所有的状态和内存信息。可以调用finish()结束处理Paused或者stopped状态的Activity。,各种状态之间通过下列的函数调用转换,voidonCreate(BundlesavedInstanceState)voidonStart()voidonRestart()voidonResume()voidonPause()voidonStop()voidonDestroy(),4.Android程序命周期的过程,1)onCreate()在窗体创建的时候执行,只执行一次2)onStart()在窗体启动的时候执行。,3)onResume(),在窗体的所有内容都被加载完成之后执行的。例如加载一个网页,文字的加载优先级要高于图片,当图片加载完成之后就是执行onResume()方法的时机。,4)onPause(),这个方法的执行时机是,当用户对窗体有数据交互时,并且窗体程序会对该数据有处理方式的时候。就是说,比方说有个按钮,程序为这个按钮设置了功能。用户点击了它,就会执行onPause()方法。若是按钮没有设置功能的时候,是不会执行onPause()方法的。,5)onStop(),当整个页面窗体被其他的窗体完全覆盖的时候,就会执行onStop()的方法。来停止当前程序的后台数据交互,整个页面会被保存到系统的堆栈里。当用户在该页面的下一个页面中点击回退键的时候,就会在堆栈里提取出该页面(堆栈空间没有被清空的时候)。,6)onRestart(),回退键会调用堆栈中即将被显示的页面的onRestart()方法。或者当你执行程序时,点击了HOME键,再次运行该程序(回到该程序的运行页面)时,也会执行onRestart()方法。,7)onDestory(),这个方法和onCreate()一样,只执行一次。在退出程序的时候执行。会清空未以文件形式保存的所有缓存记录。,13.8广播接收器,广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。,13.9Android网络编程,13.9.1AndroidHttp通信,13.9.2AndroidSocket通信,包中提供Socket和ServerSocket表示双向连接的Client和Server。在选择端口时必须小心。每个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。端口号01023为系统保留。例如80是http服务的,21是telnet服务的,23是ftp服务的。我们在选择端口号时,最好选择一个大于1023的数,防止发生冲突。在创建Socket或ServerSocket时,如果产生错误,将会抛出IOException。,要想在Client使用Socket来与一个Server通信,就必须在Client创建一个Socket,指定ServerIP地址和端口。例如:Socketsocket=newSocket(“10”,5555);在Server创建ServerSocket,指定监听的端口:ServerSocketserverSocket=newServerSocket(5555);,实际应用中ServerSocket总是不停地循环调用accept()方法,一旦收到请求就会创建线程来处理和响应。accept()是一个阻塞方法,接收到请求后会返回一个Socket来与Client进行通信。,Socket提供了getInputStream()和getOutputStream()用来得到输入流和输出流进行读写操作,这两个方法分别返回InputStream和OutputStream。为了方便读写,我们常常在InputStream和OutputStream基础上进行包装得到DataInputStream,DataOutputStream,PrintStream,InputStreamReader,OutputStreamWriter,printWriter等。,PrintStreamprintStream=newPrintStream(newBufferedOutputStream(socket.getOutputStream();PrintWriterprintWriter=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream(),true);printWriter.println(Stringmsg);DataInputStreamdis=newDataInputStream(socket.getInputStream();BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream();Stringline=br.re

温馨提示

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

评论

0/150

提交评论