




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 Activity生命周期1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。5.用户后退回到此Activity:
2、系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity二BroadcastReceive生命周期生命周期只有十秒左右,如果在 onReceive() 内做超过十
3、秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束。 普通广播,通过Context.sendBroadcast(Intent myIntent)发送的有序广播,通过Context.sendOrderedBroadcast(intent, receiverPermission)发送的,该方法第2个参数决定该广播的级别,发送优先级级别数值是在 -1000 到 1000 之间 , 值越大 , 发送的优先级越高;广播接收者接收广播时的级别可通过intentfilter中的priorit
4、y进行设置,接收优先级级别数值设为2147483647时优先级最高,同级别接收的先后是随机的, 再到级别低的收到广播,高级别的或同级别先接收到广播的可以通过abortBroadcast()方法截断广播使其他的接收者无法收到该广播和其他构造函数。异步广播,通过Context.sendStickyBroadcast(Intent myIntent)发送的,还有sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)方法,该方法具有有序广播的
5、特性也有异步广播的特性;发送异步广播需要赋权。注意:1.生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很
6、容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的2. 动态注册广播接收器还有一个特点,就是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用系统常见广播Intent,如开机启动、电池电量变化、时间改变等广播三Service 生命周期使用context.startService() 启动Service其
7、生命周期为context.startService() ->onCreate()- >onStart()->Service running->(如果调用context.stopService() )->onDestroy() ->Service shut down如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 调用stopService的时候直接onDestroy,如果是调用者自
8、己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。所以调用startService的生命周期为:onCreate -> onStart(可多次调用) -> onDestroy对于bindService()启动Service会经历:context.bindService()->onCreate()->onBind()->Service running->onUnbind() -> onDestroy() ->Service stopo
9、nBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 所以调用bindService的生命周期为:onCreate -> onBind(只一次,不可多次绑定) -> onUnbind -> onDestory。一但销毁activity它就结束,如果按home把它放到后台,那他就不退出。4 android中的动画
10、有哪几类,它们的特点和区别是什么?View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。View animation只能应用于View对象,而且只支持一部分属性,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化. 另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。5 写出三种常用layout布局并进行解释 。最常用的三种:相对布局RelativeLayout,线性布局LinearLayout,帧布局FrameLayout,网格布局GridLayout六请介
11、绍下Android的数据存储方式。 使用SharedPreferences存储数据,文件存储数据,网络存储数据,ContentProvider,SQLite数据库存储数据七写出几种service和Activity的交互方式1. 广播交互 2.共享文件交互 3. Messenger交互(信使交互) 4. 自定义接口交互 5. AIDL交互8 Fragment生命周期1. 当一个fragment被创建的时候,它会经历以下状态.。· onAttach()
12、3; onCreate()· onCreateView()· onActivityCreated()2. 当这个fragment对用户可见的时候,它会经历以下状态。· onStart()· onResume()3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。· onPause()· onStop()4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。· onPause()· onStop()· onDestroyView()· o
13、nDestroy() /· onDetach()5. 就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。· onCreate()· onCreateView()· onActivityCreated()9. view的绘制过程,讲讲draw/onDraw和drawChild这个可以口述。10. 简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver一个activity呈现了一个用户可以操作的可视化用户界面一个ser
14、vice不包含可见的用户界面,而是在后台无限地运行可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面intent:content provider在接收到ContentResolver的请求时被激活。activity, service和broadcast receiver是被称为intents的异步消息激活的。一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称
15、和待操作数据的URIIntent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的ent filter也是在manifest文件中声明的。11. IntentService有何优点?IntentService
16、是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次只能执行一个请求。 这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的Looper,Handler并且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有
17、Message的时候接着得到Intent对象通过在onHandleIntent(Intent)msg.obj)中调用你的处理程序.处理完后即会停止自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出.12. 两个Activity之间跳转时必然会执行的是哪几个方法。startActivity(Intent intent) ; startActivityForResult (Intent intent, int requestCode) ;onActivityResult (int requestCode, int re
18、sultCode, Intent data); setResult(int resultCode);13. 两个Activity之间怎么传递数据?1创建Intent对象,并配置参数,有那个activity跳转到哪个activity2在intent对象中进行存放数据,数据的格式是key-value形式3启动跳转4进入下一个到跳转的activity中,并取得intent对象5通过intent对象取得bundle对象,数据就在bundle对象中,然后通过key-value形式取得数据14. 怎么让在启动一个Activity時就启动一个service?在activity的onCreate里写start
19、Service(xxx);15. Activity怎么和service绑定,怎么在activity中启动自己对应的service?startService() 一旦被创建 调用着无关 没法使用service里面的方法 bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁bindService() 我们可以使用service 里面的方法bindService(). 让activity能够访问到 service里面的方法构建一个intent对象,Intent service = new Intent(this,MyService.class);通
20、过bindService的方法去启动一个服务,bindService(intent, new MyConn(), BIND_AUTO_CREATE);ServiceConnection 对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.十六. 什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?Service以及描述下它的生命周期:Service是运行在后台的android组件,没有用户界面,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序
21、的上下文里。Service随着启动形式的不同,其生命周期稍有差别。当用Context.startService()来启动时,Service的生命周期依次为:oncreate>onStartCommand>onDestroy 当用Context.bindService()启动时:onStart>onBind>onUnbind>onDestroy。Service启动方式有两种;一是Context.startService和Context.bindService。区别是通过startService启动时Service组件和应用程序没多大的联系;当用访问者启动之后,如果访
22、问者不主动关闭,Service就不会关闭,Service组件之间因为没什么关联,所以Service也不能和应用程序进行数据交互。而通过bindService进行绑定时,应用程序可以通过ServiceConnection进行数据交互。在实现Service时重写的onBind方法中,其返回的对象会传给ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)中的service参数;也就是说获取了serivce这个参数就得到了Serivce组件返回的值。Context.bindService(Intent i
23、ntent,ServiceConnection conn,int flag)其中只要与Service连接成功conn就会调用其onServiceConnected方法,停用Service使用Context.stopService。17. 什么时候使用Service?Android开发中,当需要创建在后台运行的程序的时候(主进程不能进行耗时操作),就要使用到Service。Service 可以分为有无限生命和有限生命两种。(1) 默认情况下,Service其实是运行在主线程中的,如果需要执行复杂耗时的操作,必须在Service中再创建一个Thread来执行任务。(2) Service的优先级高于
24、后台挂起的Activity,当然,也高于Activity所创建的Thread,因此,系统可能在内存不足的时候优先杀死后台的Activity或者Thread,而不会轻易杀死Service组件,即使被迫杀死Service,也会在资源可用时重启被杀死的Service19. http怎么加入超时和代理Http连接的超时机制能够防止连接线程的无限期等待,一般可分为connect timeout和socket timeout二十二. 在manifest和代码中如何注册和使用 broadcast receiver 。1. <!-本程序需要请求的这个权限,否则
25、自己也无法调用这个广播了-> 2. <uses-permission android:name="com.test.mybrpermission"/> 1. <!-该receiver的调用者需要请求的一个权限-> 2. <receiver android:name=".MyReceiver&
26、quot; 3. android:exported="true" 4. android:permission="com.test.mybrpermission" 5. &
27、#160; > 6. <intent-filter android:priority="20"> 7.
28、; <action android:name="com.test.mybr"/> 8. </intent-filter> 9. </receiver> 二十三. 谈谈UI中, Padding和Margin有
29、什么区别?Padding 为内边框,指该控件内部内容,如文本/图片距离该控件的边距Margin 为外边框,指该控件距离边父控件的边距 二十五. 谈谈对Android NDK的理解。1、NDK 是一系列工具的集合。NDK提供了一系列的工具,帮助开发者快速开发 C (或 C+ )的动态库,并能自动将 so 和 java 应用一起打包成 apk 。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU 、平台、 ABI 等差异,开发人员只需要简单修改 mk 文件(指出 “ 哪些文件需要编译 ” 、 “ 编译特性要求 ” 等),就可以创建出 so 。
30、 NDK可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工作。 2、NDK 提供了一份稳定、功能有限的 API 头文件声明。 Google明确声明该 API 是稳定的,在后续所有版本中都稳定支持当前发布的 API 。从该版本的 NDK 中看出,这些 API 支持的功能非常有限,包含有: C 标准库( libc )、标准数学库( libm )、压缩库( libz )、 Log 库( liblog )。二十七. Android系统中GC什么情况下会出现内存泄露呢?1. 数据库的cursor没有关闭 2.构造adapter时,没有使用缓存con
31、tentview 衍生listview的优化问题-减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/ 3.Bitmap对象不使用时采用recycle()释放内存 4.activity中的对象的生命周期大于activity 二十八. 什么是ANR 如何避免它? 无响应问题,如果你在activity中有进行耗时长的问题,就会产生这个问题。二十九. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?onSaveInstanceState() 当你的程序中某一个Activity A在运行时,主动或被动地运
32、行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。三十. 如何退出Activity1、抛异常强制退出:该方法通过抛异常,使程序Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。2、记录打开的Activi
33、ty:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。3、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。4、递归退出在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。三十一. android:gravity与android:layout_gravity的区别控件本身和控件內容三十二. 注册广播接收者两种方式的区别,及优缺点1)第一种是常驻型(静态注册),也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用
34、自动运行。2)第二种不是常驻型广播(动态注册),也就是说广播跟随程序的生命周期。三十三. AsyncTask 的异步机制和普通线程有什么区别,分别有哪些优缺点。Android应用程序的编写是在Java的基础上进行的,android为了更方便的在线程中操作Ui,延伸出了AsyncTask,因此如果在做android的应用开发的时候,如果需要用到与界面相关的线程的时候首选AsyncTask,如果线程主要用来处理数据,不参与界面操作的时候尽量用Thread线程,因为Thread较AsyncTask比有很多优点(参考javaAPI),另外如果在应用中需要启动多个线程的时候,也要使用Threa
35、d,它自带多线程处理。总的来说,如果需要简单的操作Ui,AsyncTask更好一些。如果不操作UI或者后台线程比较复杂,Thread更好一些。三十四. Handler机制和原理三十五. Service生命周期,如何启用Service,如何停用Service。三十六. 隐式、显式Intent的区别。显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。 隐式Intent恰恰相反,它不会用组件名称定义需要激活的目
36、标组件,它更广泛地用于在不同应用程序之间传递消息。 在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。 而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。 三十八. 简述Android应用程序结构是哪些?1,Android应用程序层2,应用程序框架层3,系统运行库层4,Linux核心层详细的请上网搜索 三十九. Android四大组件分别是什么?对各种组件
37、的理解?android四大组件分别为Activity、Service、BroadcastReceiver、ContentProvider。四十一. 什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?抛出运行时异常时就会导致Force Close,比如空指针、数组越界、类型转换异常等等。 捕获:可以通过logcat查看抛出异常的代码出现的位置,然后到程序对应代码中进行修改。 避免:编写程序时,要思维缜密,在可能出现异常的地方都作相应的处理,增强程序的健壮性。五十. 能说出几个系统内置的Intent吗?1.从google搜索内容 In
38、tent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"searchString") startActivity(intent); 2.浏览网页 Uri uri = Uri.parse(""); Intent it = new Intent(Intent.ACTIO
39、N_VIEW,uri); startActivity(it); 3.显示地图 Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.Action_VIEW,uri); startActivity(it); 4.路径规划 Uri uri = Uri.parse("Intent it = new Intent(In
40、tent.ACTION_VIEW,URI); startActivity(it); 5.拨打电话 Uri uri = Uri.parse("tel:xxxxxx"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); 6.调用发短信的程序 Intent it = new Intent(Intent.ACTION_VIEW); &
41、#160;it.putExtra("sms_body", "The SMS text"); it.setType("vnd.android-dir/mms-sms"); startActivity(it); 7.发送短信 Uri uri = Uri.parse("smsto:0800000123"); Intent it = new Intent(Intent.ACTION_SENDTO, uri);
42、60; it.putExtra("sms_body", "The SMS text"); startActivity(it); String body="this is sms demo" Intent mmsintent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", number, null); mmsintent.putExtra(Messagi
43、ng.KEY_ACTION_SENDTO_MESSAGE_BODY, body); mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true); startActivity(mmsintent); 8.发送彩信 Uri uri = Uri.parse("content:
44、/media/external/images/media/23"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra("sms_body", "some text"); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType("image/png"); startActivity(it);
45、;StringBuilder sb = new StringBuilder(); sb.append("file:/"); sb.append(fd.getAbsoluteFile(); Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mmsto", number, null); / Below extra datas are all optional. intent.putEx
46、tra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject); intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString(); intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode);
47、 intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent); startActivity(intent); 9.发送Email Uri uri = Uri.parse("mailto:xxx"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it); Int
48、ent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "me"); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity(Intent.createChooser(it, "Choose Email Client&
49、quot;); Intent it=new Intent(Intent.ACTION_SEND); String tos="me" String ccs="you" it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text&q
50、uot;); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.setType("message/rfc822"); startActivity(Intent.createChooser(it, "Choose Email Client"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtr
51、a(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "file:/sdcard/mysong.mp3"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client"); 10.播放多媒体
52、 Intent it = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:/sdcard/song.mp3"); it.setDataAndType(uri, "audio/mp3"); startActivity(it); Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, &q
53、uot;1"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); 11.uninstall apk Uri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it);
54、0; 12.install apk Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 13. 打开照相机 <1>Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null); this.
55、sendBroadcast(i); <2>long dateTaken = System.currentTimeMillis(); String name = createName(dateTaken) + ".jpg" fileName = folder + name; ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, fileName); &
56、#160;values.put("_data", fileName); values.put(Images.Media.PICASA_ID, fileName); values.put(Images.Media.DISPLAY_NAME, fileName); values.put(Images.Media.DESCRIPTION, fileName); values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName);
57、; Uri photoUri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(inttPhot
58、o, 10); 14.从gallery选取图片 Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(i, 11); 15. 打开录音机 Intent mi = new Intent(Media.RECORD_SOUND_ACTION);
59、;startActivity(mi); 16.显示应用详细列表 Uri uri = Uri.parse("market:/details?id=app_id"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); /where app_id is the application ID, find the ID /by clicking on your appl
60、ication on Market home /page, and notice the ID from the address bar 刚才找app id未果,结果发现用package name也可以 Uri uri = Uri.parse("market:/details?id=<packagename>"); 这个简单多了 17.寻找应用 Uri uri = Uri.parse("market:/search?q=p
61、name:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); /where pkg_name is the full package path for an application 18.打开联系人列表 <1> Intent i = new Intent(); i.setAction(Intent.ACTION_G
62、ET_CONTENT); i.setType("vnd.android.cursor.item/phone"); startActivityForResult(i, REQUEST_TEXT); <2> Uri uri = Uri.parse("content:/contacts/people"); Intent it = new Intent(Intent.ACTION_PICK, uri); startAct
63、ivityForResult(it, REQUEST_TEXT); 19.打开另一程序 Intent i = new Intent(); ComponentName cn = new ComponentName("com.yellowbook.android2", "com.yellowbook.android2.AndroidSearch"); i.setComponent(cn); i.setAction("a
64、ent.action.MAIN"); startActivityForResult(i, RESULT_OK); 五十一. 如何自定义一个控件?1、了解View的工作原理 2、 编写继承自View的子类3、 为自定义View类增加属性 4、 绘制控件 5、 响应用户消息 6 、自定义回调函数 一、View结构原理Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类。View定义了绘图的基本操作基本操作由三个
65、函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。具体操作如下:1、measure操作 measure操作主要用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数: (1)onMeasure(),视图大小的将在这里最终确定,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图
66、大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。 2、layout操作 layout操作用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作: (1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来; (2)onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的; 3、draw操作 draw操作利用前两部得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。子类也不应该修改该方法,因为其内部定义了绘图的基本操作: (1)绘制背景;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年信号功分器行业深度研究分析报告
- 征地合同协议书范本下载
- 固废商业计划书
- 钢构合同协议书质保金
- 中国PVB膜项目创业计划书
- 公共技术服务平台项目可行性研究报告
- 2025年文化创意咖啡厅商业计划书
- 商用机器人商业计划书
- 2025年石墨烯触摸屏市场环境分析
- 外发组装合同协议书
- 绘画油画入门行业跨境出海战略研究报告
- 医学资料 颈部脊髓损伤后遗症护理查房 学习课件
- DB50-T 1279-2022 民用醇基液体燃料应用技术规程
- 中学生防诈骗安全课件
- 江口县芭蕉芋农产品初加工淀粉生产项目环评资料环境影响
- 2025年中远海运考试题及答案
- 转正答辩流程
- 2025年瑞幸考试试题及答案
- 肿瘤防治中医科普知识
- 品牌策划与管理(第5版) 课件全套 程宇宁 第1-10章 品牌基本概念- 品牌国际化战略与管理
- 数字人直播代运营协议
评论
0/150
提交评论