ImageVerifierCode 换一换
格式:DOCX , 页数:94 ,大小:1,001.01KB ,
资源ID:23883747      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23883747.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(安卓开发技巧总汇第一章.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

安卓开发技巧总汇第一章.docx

1、安卓开发技巧总汇第一章 目录 11. 入门实例剖析1 22.在测试时,如何实现一个提示 83.可以使用AlertDialog.Builder 才产生一个提示框. 94. menu 的用法. 101. 简单的代码 102. menu实现的两种方法 105.Activity 的切换(含Bundle传值) 141. 代码 142. 详解: 156.AndroidUILayout 191. AbsoluteLayout 197. Tab以及 HostTab操作 208. List (图片/按钮/标题/文本) 26LIST例一 27LIST例二 36LIST例三 409. 调用浏览器 载入某网址 431

2、0.监控应用程序包的安装&删除 43方法一: 43方法二: 4611. 使用Toast输出一个字符串 5212. 把一个字符串写进文件 5213. 把文件内容读出到一个字符串 5414. 调用Android installer 安装和卸载程序 5515. 结束某个进程 5516. 设置默认来电铃声 5617. 开机自启动 5718. 线程与子线程 58handlerMessage实例 5819. Service 601. 什么是Service 602. 如何使用Service 603. Service的生命周期 66附) 常用界面截图: 67提示1 67提示2 68菜单 681. 入门实例剖析

3、1开卷语俗话说,“熟读唐诗三百首,不会作诗也会吟”。最近收集了很多Android的示例代码,从这些代码的阅读和实验中学习到很多知识,从而产生写这个系列的打算,目标就是一步步跟着实例进行动手实作,真正从“做”中体会和学习Android开发。 本文目标是Android自带的一个范例程序:记事本, 预备知识搭建开发环境,尝试编写”Hello World”,了解Android的基本概念,熟悉Android的API(官方文档中都有,不赘述)。程序截图先来简单了解下程序运行的效果 1 2 3 4程序入口点类似于win32程序里的WinMain函数,Android自然也有它的程序入口点。它通过在Androi

4、dManifest.xml文件中配置来指明,可以看到名为NotesList的activity节点下有这样一个intent-filter,其action为android.intent.action.MAIN,Category指定为 android.intent.category.LAUNCHER,这就指明了这个activity是作为入口activity,系统查找到它后,就会创建这个activity实例来运行,若未发现就不启动(你可以把MAIN改名字试试)。NotesList详解就从入口点所在的activity(见图1)开始,可以看到这个activity最重要的功能就是显示日志列表。这个程序的日志

5、都存放在Sqlite数据库中,因此需要读取出所有的日志记录并显示。先来看两个重要的私有数据,第一个PROJECTION字段指明了“日志列表“所关注的数据库中的字段(即只需要ID和Title就可以了)。privatestaticfinal String PROJECTION =new String Notes._ID, / 0 Notes.TITLE, / 1 ;第二个字段COLUMN_INDEX_TITLE指明title字段在数据表中的索引。privatestaticfinalint COLUMN_INDEX_TITLE =1;然后就进入第一个调用的函数onCreate。 Intent int

6、ent = getIntent(); if (intent.getData() =null) intent.setData(Notes.CONTENT_URI); 因为NotesList这个activity是系统调用的,此时的intent是不带数据和操作类型的,系统只是在其中指明了目标组件是Notelist,所以这里把”content:/ com.google.provider.NotePad/notes”保存到intent里面,这个URI地址指明了数据库中的数据表名(参见以后的NotePadProvider类),也就是保存日志的数据表notes。 Cursor cursor = manage

7、dQuery(getIntent().getData(), PROJECTION, null, null, Notes.DEFAULT_SORT_ORDER); 然后调用managedQuery函数查询出所有的日志信息,这里第一个参数就是上面设置的” content:/ com.google.provider.NotePad/notes”这个URI,即notes数据表。PROJECTION 字段指明了结果中所需要的字段,Notes.DEFAULT_SORT_ORDER 指明了结果的排序规则。实际上managedQuery并没有直接去查询数据库,而是通过Content Provider来完成实际

8、的数据库操作,这样就实现了逻辑层和数据库层的分离。SimpleCursorAdapter adapter =new SimpleCursorAdapter(this, R.layout.noteslist_item, cursor, new String Notes.TITLE , newint android.R.id.text1 ); setListAdapter(adapter); 查询出日志列表后,构造一个CursorAdapter,并将其作为List View的数据源,从而在界面上显示出日志列表。可以看到,第二个参数是R.layout.noteslist_item,打开对应的note

9、slist_item.xml文件, 就是用来显示一条日志记录的TextView,最后两个字段指明了实际的字段映射关系,通过这个TextView来显示一条日志记录的title字段。处理“选择日志”事件既然有了“日志列表”,就自然要考虑如何处理某一条日志的单击事件,这通过重载onListItemClick方法来完成, Override protectedvoid onListItemClick(ListView l, View v, int position, long id) Uri uri = ContentUris.withAppendedId(getIntent().getData(),

10、id); String action = getIntent().getAction(); if (Intent.ACTION_PICK.equals(action) | Intent.ACTION_GET_CONTENT.equals(action) / The caller is waiting for us to return a note selected by / the user. The have clicked on one, so return it now. setResult(RESULT_OK, new Intent().setData(uri); else / Lau

11、nch activity to view/edit the currently selected item startActivity(new Intent(Intent.ACTION_EDIT, uri); 首先通过”content:/ com.google.provider.NotePad/notes”和日志的id 号拼接得到选中日志的真正URI,然后创建一个新的Intent,其操作类型为Intent.ACTION_EDIT,数据域指出待编辑的日志URI(这里只分析else块)。Intent深度剖析那么,上面这句startActivity(new Intent(Intent.ACTION_

12、EDIT, uri)执行后会发生什么事情呢?这时候Android系统就跳出来接管了,它会根据intent中的信息找到对应的activity,在这里找到的是NoteEditor这个activity,然后创建这个activity的实例并运行。那么,Android又是如何找到NoteEditor这个对应的activity的呢?这就是intent发挥作用的时刻了。new Intent(Intent.ACTION_EDIT, uri)这里的Intent.ACTION_EDIT=” android.intent.action.EDIT”,另外通过设置断点,我们看下这里的uri值: 可以看到选中的日志条目的

13、URI是:content:/com.google.provider.NotePad/notes/1然后我们再来看下Androidmanfest.xml,其中有这个provider 发现没有?它也有com.google.provider.NotePad,这个是content:/com.google.provider.NotePad/notes/1的一部分,同时 上面第一个intent-filter中有一个action 名为android.intent.action.EDIT,而前面我们创建的Intent也正好是Intent.ACTION_EDIT=” android.intent.action.

14、EDIT”,想必大家已经明白是怎么回事了吧。下面就进入activity选择机制了:系统从intent中获取道uri,得到了content:/com.google.provider.NotePad/notes/1,去掉开始的content:标识,得到com.google.provider.NotePad/notes/1,然后获取前面的com.google.provider.NotePad,然后就到Androidmanfest.xml中找到authorities为com.google.provider.NotePad的provider,这个就是后面要讲的contentprovider,然后就加载这

15、个content provider。在这里是NotePadProvider,然后调用NotePadProvider的gettype函数,并把上述URI传给这个函数,函数返回URI所对应的类型(这里返回Notes.CONTENT_ITEM_TYPE,代表一条日志记录,而CONTENT_ITEM_TYPE = vnd.android.cursor.item/vnd.google.note )。 Override public String getType(Uri uri) switch (sUriMatcher.match(uri) case NOTES: return Notes.CONTENT

16、_TYPE; case NOTE_ID: return Notes.CONTENT_ITEM_TYPE; default: thrownew IllegalArgumentException(Unknown URI + uri); 上面的sUriMatcher.match是用来检测uri是否能够被处理,而sUriMatcher.match(uri)返回值其实是由 sUriMatcher =new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(NotePad.AUTHORITY, notes, NOTES); sUriMatcher.ad

17、dURI(NotePad.AUTHORITY, notes/#, NOTE_ID);决定的。然后系统使用获得的 vnd.android.cursor.item/vnd.google.note 和”android.intent.action.EDIT”到androidmanfest.xml中去找匹配的activity.正好NoteEditor这个activity的intent-filter满足上述条件,这样就找到了NoteEditor。于是系统加载这个类并实例化,运行,然后就到了NoteEditor的OnCreate函数中(见后续文章)。小技巧1,在命令行中使用”adb shell”命令进入系统

18、中,然后”cd app”进入应用程序所在目录,”rm XXX”就可以删除你指定的apk,从而去掉其在系统顶层界面占据的图标,若两次”cd data”则可以进入应用程序使用的数据目录,你的数据可以保存在这里,例如Notepad就是把其数据库放在它的databases目录下,名为note_pad.db.2,第一次启动模拟器会比较慢,但以后就别关闭模拟器了,修改代码,调试都不需要再次启动的,直接修改后run或debug就是。2.在测试时,如何实现一个提示可以使用1. Toast.makeText(this,这是一个提示,Toast.LENGTH_SHORT).show();2. /从资源文件stri

19、ng.xml 里面取提示信息3. Toast.makeText(this, getString(R.string.welcome), Toast.LENGTH_SHORT).show();这个提示会几秒钟后消失3.可以使用AlertDialog.Builder 才产生一个提示框. 例如像messagebox那样的1. newAlertDialog.Builder(this)2. .setTitle(Android提示)3. .setMessage(这是一个提示,请确定)4. .show();带一个确定的对话框1. newAlertDialog.Builder(this)2. .setMessa

20、ge(这是第二个提示)3. .setPositiveButton(确定,4. newDialogInterface.OnClickListener()5. publicvoidonClick(DialogInterfacedialoginterface,inti)6. /按钮事件7. 8. )9. .show();AlertDialog.Builder 还有很多复杂的用法,有确定和取消的对话框1. newAlertDialog.Builder(this)2. .setTitle(提示)3. .setMessage(确定退出?)4. .setIcon(R.drawable.quit)5. .se

21、tPositiveButton(确定,newDialogInterface.OnClickListener()6. publicvoidonClick(DialogInterfacedialog,intwhichButton)7. setResult(RESULT_OK);/确定按钮事件8. finish();9. 10. )11. .setNegativeButton(取消,newDialogInterface.OnClickListener()12. publicvoidonClick(DialogInterfacedialog,intwhichButton)13. /取消按钮事件14.

22、15. )16. .show();4. menu 的用法. 1. 简单的代码1. publicstaticfinalintITEM_1_ID=Menu.FIRST;2. publicstaticfinalintITEM_2_ID=Menu.FIRST+1;3. publicstaticfinalintITEM_3_ID=Menu.FIRST+2;4. 5. publicbooleanonCreateOptionsMenu(Menumenu)6. super.onCreateOptionsMenu(menu);7. /不带图标的menu8. menu.add(0,ITEM_1_ID,0,item-1);9. /带图标的menu10. menu.add(0,ITEM_2_ID,1,item-2).setIcon(R.drawable.editbills2);11. menu.add(0,ITEM_3_ID,2,item-3).setIcon(R.drawable.billsum1);12. returntrue;13. 14. 15. publicbooleanonOptionsItemSelected(MenuItemitem)16. switch(item.getItemId()17. case1:18. Toa

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1