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

上传人:b****8 文档编号:23883747 上传时间:2023-05-21 格式:DOCX 页数:94 大小:1,001.01KB
下载 相关 举报
安卓开发技巧总汇第一章.docx_第1页
第1页 / 共94页
安卓开发技巧总汇第一章.docx_第2页
第2页 / 共94页
安卓开发技巧总汇第一章.docx_第3页
第3页 / 共94页
安卓开发技巧总汇第一章.docx_第4页
第4页 / 共94页
安卓开发技巧总汇第一章.docx_第5页
第5页 / 共94页
点击查看更多>>
下载资源
资源描述

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

《安卓开发技巧总汇第一章.docx》由会员分享,可在线阅读,更多相关《安卓开发技巧总汇第一章.docx(94页珍藏版)》请在冰豆网上搜索。

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

安卓开发技巧总汇第一章

 <>

目录

 <>1

1.入门实例剖析12

2.在测试时,如何实现一个提示8

3.可以使用AlertDialog.Builder才产生一个提示框.9

4.menu的用法.10

1.简单的代码10

2.menu实现的两种方法10

5.Activity的切换(含Bundle传值)14

1.代码14

2.详解:

15

6.Android UI Layout19

1.AbsoluteLayout19

7.Tab以及HostTab操作20

8.List(图片/按钮/标题/文本)26

LIST例一27

LIST例二36

LIST例三40

9.调用浏览器载入某网址43

10.监控应用程序包的安装&删除43

方法一:

43

方法二:

46

11.使用Toast输出一个字符串52

12.把一个字符串写进文件52

13.把文件内容读出到一个字符串54

14.调用Androidinstaller安装和卸载程序55

15.结束某个进程55

16.设置默认来电铃声56

17.开机自启动57

18.线程与子线程58

handlerMessage实例58

19.Service60

1.什么是Service60

2.如何使用Service60

3.Service的生命周期66

附)常用界面截图:

67

提示167

提示268

菜单68

1.入门实例剖析1

开卷语

俗话说,“熟读唐诗三百首,不会作诗也会吟”。

最近收集了很多Android的示例代码,从这些代码的阅读和实验中学习到很多知识,从而产生写这个系列的打算,目标就是一步步跟着实例进行动手实作,真正从“做”中体会和学习Android开发。

本文目标是Android自带的一个范例程序:

记事本,

预备知识

搭建开发环境,尝试编写”HelloWorld”,了解Android的基本概念,熟悉Android的API(官方文档中都有,不赘述)。

程序截图

先来简单了解下程序运行的效果

1

2

3

4

程序入口点

类似于win32程序里的WinMain函数,Android自然也有它的程序入口点。

它通过在AndroidManifest.xml文件中配置来指明,可以看到名为NotesList的activity节点下有这样一个intent-filter,其action为android.intent.action.MAIN,

Category指定为android.intent.category.LAUNCHER,这就指明了这个activity是作为入口activity,系统查找到它后,就会创建这个activity实例来运行,若未发现就不启动(你可以把MAIN改名字试试)。

name="android.intent.action.MAIN"

/>

name="android.intent.category.LAUNCHER"

/>

NotesList详解

就从入口点所在的activity(见图1)开始,可以看到这个activity最重要的功能就是显示日志列表。

这个程序的日志都存放在Sqlite数据库中,因此需要读取出所有的日志记录并显示。

先来看两个重要的私有数据,第一个PROJECTION字段指明了“日志列表“所关注的数据库中的字段(即只需要ID和Title就可以了)。

private

static

finalString[]PROJECTION=

newString[]{

Notes._ID,//0

Notes.TITLE,//1

};

第二个字段COLUMN_INDEX_TITLE指明title字段在数据表中的索引。

private

static

final

intCOLUMN_INDEX_TITLE=

1;

然后就进入第一个调用的函数onCreate。

Intentintent=getIntent();

if(intent.getData()==

null)

{

intent.setData(Notes.CONTENT_URI);

}

因为NotesList这个activity是系统调用的,此时的intent是不带数据和操作类型的,系统只是在其中指明了目标组件是Notelist,所以这里把”content:

//com.google.provider.NotePad/notes”保存到intent里面,这个URI地址指明了数据库中的数据表名(参见以后的NotePadProvider类),也就是保存日志的数据表notes。

Cursorcursor=managedQuery(getIntent().getData(),PROJECTION,null,null,Notes.DEFAULT_SORT_ORDER);

然后调用managedQuery函数查询出所有的日志信息,这里第一个参数就是上面设置的”content:

//com.google.provider.NotePad/notes”这个URI,即notes数据表。

PROJECTION字段指明了结果中所需要的字段,Notes.DEFAULT_SORT_ORDER指明了结果的排序规则。

实际上managedQuery并没有直接去查询数据库,而是通过ContentProvider来完成实际的数据库操作,这样就实现了逻辑层和数据库层的分离。

SimpleCursorAdapteradapter=

newSimpleCursorAdapter(this,R.layout.noteslist_item,cursor,

newString[]{Notes.TITLE},new

int[]{android.R.id.text1});

setListAdapter(adapter);

查询出日志列表后,构造一个CursorAdapter,并将其作为ListView的数据源,从而在界面上显示出日志列表。

可以看到,第二个参数是R.layout.noteslist_item,打开对应的noteslist_item.xml文件,

android="

android:

id="@android:

id/text1"

android:

layout_width="fill_parent"

android:

layout_height="?

android:

attr/listPreferredItemHeight"

android:

textAppearance="?

android:

attr/textAppearanceLarge"

android:

gravity="center_vertical"

android:

paddingLeft="5dip"

android:

singleLine="true"

/>

就是用来显示一条日志记录的TextView,最后两个字段指明了实际的字段映射关系,通过这个TextView来显示一条日志记录的title字段。

处理“选择日志”事件

既然有了“日志列表”,就自然要考虑如何处理某一条日志的单击事件,这通过重载onListItemClick方法来完成,

@Override

protected

voidonListItemClick(ListViewl,Viewv,intposition,longid){

Uriuri=ContentUris.withAppendedId(getIntent().getData(),id);

Stringaction=getIntent().getAction();

if(Intent.ACTION_PICK.equals(action)||Intent.ACTION_GET_CONTENT.equals(action)){

//Thecalleriswaitingforustoreturnanoteselectedby

//theuser.Thehaveclickedonone,soreturnitnow.

setResult(RESULT_OK,newIntent().setData(uri));

}else{

//Launchactivitytoview/editthecurrentlyselecteditem

startActivity(newIntent(Intent.ACTION_EDIT,uri));

}

}

首先通过”content:

//com.google.provider.NotePad/notes”和日志的id号拼接得到选中日志的真正URI,然后创建一个新的Intent,其操作类型为Intent.ACTION_EDIT,数据域指出待编辑的日志URI(这里只分析else块)。

Intent深度剖析

那么,上面这句startActivity(newIntent(Intent.ACTION_EDIT,uri))执行后会发生什么事情呢?

这时候Android系统就跳出来接管了,它会根据intent中的信息找到对应的activity,在这里找到的是NoteEditor这个activity,然后创建这个activity的实例并运行。

那么,Android又是如何找到NoteEditor这个对应的activity的呢?

这就是intent发挥作用的时刻了。

newIntent(Intent.ACTION_EDIT,uri)

这里的Intent.ACTION_EDIT=”android.intent.action.EDIT”,另外通过设置断点,我们看下这里的uri值:

可以看到选中的日志条目的URI是:

content:

//com.google.provider.NotePad/notes/1

然后我们再来看下Androidmanfest.xml,其中有这个provider

name="NotePadProvider"

android:

authorities="com.google.provider.NotePad"

/>

发现没有?

它也有com.google.provider.NotePad,这个是content:

//com.google.provider.NotePad/notes/1的一部分,同时

name="NoteEditor"

android:

theme="@android:

style/Theme.Light"

android:

label="@string/title_note"

android:

screenOrientation="sensor"

android:

configChanges="keyboardHidden|orientation"

>

--Thisfiltersaysthatwecanvieworeditthedataof

asinglenote-->

label="@string/resolve_edit">

name="android.intent.action.VIEW"

/>

name="android.intent.action.EDIT"

/>

name="com.android.notepad.action.EDIT_NOTE"

/>

name="android.intent.category.DEFAULT"

/>

mimeType="vnd.android.cursor.item/vnd.google.note"

/>

--Thisfiltersaysthatwecancreateanewnoteinside

ofadirectoryofnotes.-->

name="android.intent.action.INSERT"

/>

name="android.intent.category.DEFAULT"

/>

mimeType="vnd.android.cursor.dir/vnd.google.note"

/>

上面第一个intent-filter中有一个action名为android.intent.action.EDIT,而前面我们创建的Intent也正好是

Intent.ACTION_EDIT=”android.intent.action.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,然后就加载这个contentprovider。

name="NotePadProvider"

android:

authorities="com.google.provider.NotePad"

/>

在这里是NotePadProvider,然后调用NotePadProvider的gettype函数,并把上述URI传给这个函数,函数返回URI所对应的类型(这里返回Notes.CONTENT_ITEM_TYPE,代表一条日志记录,而CONTENT_ITEM_TYPE="vnd.android.cursor.item/vnd.google.note")。

@Override

publicStringgetType(Uriuri){

switch(sUriMatcher.match(uri)){

caseNOTES:

returnNotes.CONTENT_TYPE;

caseNOTE_ID:

returnNotes.CONTENT_ITEM_TYPE;

default:

throw

newIllegalArgumentException("UnknownURI"

+uri);

}

}

上面的sUriMatcher.match是用来检测uri是否能够被处理,而sUriMatcher.match(uri)返回值其实是由

sUriMatcher=

newUriMatcher(UriMatcher.NO_MATCH);

sUriMatcher.addURI(NotePad.AUTHORITY,"notes",NOTES);

sUriMatcher.addURI(NotePad.AUTHORITY,"notes/#",NOTE_ID);

决定的。

然后系统使用获得的"vnd.android.cursor.item/vnd.google.note"和”android.intent.action.EDIT”到androidmanfest.xml中去找匹配的activity.

label="@string/resolve_edit">

name="android.intent.action.VIEW"

/>

name="android.intent.action.EDIT"

/>

name="com.android.notepad.action.EDIT_NOTE"

/>

name="android.intent.category.DEFAULT"

/>

mimeType="vnd.android.cursor.item/vnd.google.note"

/>

正好NoteEditor这个activity的intent-filter满足上述条件,这样就找到了NoteEditor。

于是系统加载这个类并实例化,运行,然后就到了NoteEditor的OnCreate函数中(见后续文章)。

小技巧

1,在命令行中使用”adbshell”命令进入系统中,然后”cdapp”进入应用程序所在目录,”rmXXX”就可以删除你指定的apk,从而去掉其在系统顶层界面占据的图标,若两次”cddata”则可以进入应用程序使用的数据目录,你的数据可以保存在这里,例如Notepad就是把其数据库放在它的databases目录下,名为note_pad.db.

2,第一次启动模拟器会比较慢,但以后就别关闭模拟器了,修改代码,调试都不需要再次启动的,直接修改后run或debug就是。

2.在测试时,如何实现一个提示

可以使用

1.Toast.makeText(this, "这是一个提示", Toast.LENGTH_SHORT).show(); 

2.//从资源文件string.xml里面取提示信息

3. Toast.makeText(this,getString(R.string.welcome),Toast.LENGTH_SHORT).show();

这个提示会几秒钟后消失

3.可以使用AlertDialog.Builder才产生一个提示框.

  例如像messagebox那样的

1.   new AlertDialog.Builder(this)

2.    .setTitle("Android 提示")

3.    .setMessage("这是一个提示,请确定")

4.    .show();

带一个确定的对话框

1.new AlertDialog.Builder(this)

2.         .setMessage("这是第二个提示")

3.         .setPositiveButton("确定",

4.                         new DialogInterface.OnClickListener(){

5.                                 public void onClick(DialogInterface dialoginterface, int i){

6.                                     //按钮事件

7.                                 }

8.                         })

9.         .show();

AlertDialog.Builder还有很多复杂的用法,有确定和取消的对话框

1.new AlertDialog.Builder(this)

2.        .setTitle("提示")

3.        .setMessage("确定退出?

")

4.        .setIcon(R.drawable.quit)

5.        .setPositiveButton("确定", new DialogInterface.OnClickListener() {

6.        public void onClick(DialogInterface dialog, int whichButton) {

7.        setResult(RESULT_OK);//确定按钮事件

8.        finish();

9.        }

10.        })

11.        .setNegativeButton("取消", new DialogInterface.OnClickListener() {

12.        public void onClick(DialogInterface dialog, int whichButton) {

13.         //取消按钮事件

14.        }

15.        })

16.        .show();

4.menu的用法.

1.简单的代码

1.public static final int ITEM_1_ID = Menu.FIRST;

2.public static final int ITEM_2_ID = Menu.FIRST + 1;

3.public static final int ITEM_3_ID = Menu.FIRST + 2;

4.    

5.public boolean onCreateOptionsMenu(Menu menu) {

6.        super.onCreateOptionsMenu(menu);

7.//不带图标的menu

8.        menu.add(0, ITEM_1_ID, 0, "item-1");       

9.//带图标的menu

10.        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.        return true; 

13.}

14.

15.public boolean onOptionsItemSelected(MenuItem item){

16.       switch (item.getItemId()) {

17.       case 1:

18.           Toa

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

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

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