Android电话播号与短信发送实现代码
Android应用程序架构
src/ java原代码存放目录
gen/ 自动生成目录
gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的xml界面文件、图标与常量,同步更新修改 R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
res/ 资源(Resource)目录
存放应用使用到的各种资源,如xml界面文件,图片或数据。
AndroidManifest.xml 功能清单文件
列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的服务(如电话服务、互联网服务、短信服务、GPS服务等等)。
当新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activity。
default.properties 项目环境信息,一般是不需要修改此文件
Intent:当找到与设置的Intent限制相同的Activity时候通过startActivity()就会启动该Activity
电话播号器:
)AndroidManifest.xml中添加电话服务权限:
代码如下 | 复制代码 |
<uses-permission android:name="android.permission.CALL_PHONE"/> |
2)界面布局
代码如下 | 复制代码 |
LinearLayout (线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局) |
3)Activity:
为按钮增加单击事件,在这个事件中添加处理事件的代码
在Android开发中,为了效率的考虑我们使用内部类会很多,这里就是经常会出现的一个地方.
为按钮添加单击事件,并在事件中处理程序.
代码如下 | 复制代码 |
或
|
短信发送器:
代码如下 | 复制代码 |
SmsManager manager = SmsManager.getDefault(); **************************************************************** findViewById(R.id.button);// 根据id查找显示控件; @+id/button:在R文件的id内部类里面,添加一个id为button的常量,使用该常量的值作为此控件的id值; 单元测试: |
继承类:AndroidTestCase
代码如下 | 复制代码 |
<instrumentation <application actual = function(); |
结:
--使用系统服务的时候不要忘记在AndroidManifest.xml中添加服务权限
--短信服务在这里,使用了SmsManager类,来操作.
--发送短信时要判断是否大于70个字
--Toast使用的时候,不要忘记show().要不然不会显示.
使用方法是这样的,Activity.showDialog()激发Activity.onCreateDialog()创建Dialog,然后显示之,便于多个Dialog的统一管理。
注意,以后再用Activity.showDialog()显示同一个Dialog时,则不会调用Activity.onCreateDialog(),
而是调用Activity.onPrepareDialog(),使用上一次显示Dialog时的状态。即
第一次:showDialog() -> onCreatedialog()
以后: showDialog() -> onPrepareDialog()
在用oncreatedialog回调创建dialogd时候,系统会缓存dialog,下次直接就显示上次显示的内容。
当一个Dialog第一次被调用的时候,Android系统会调用你应该实例化Dialog的Activity的onCreateDialog方法,
这个方法会启动你从showDialog(int)方法里面传递的那个ID参数所定义的Dialog,当你创建成功后,在方法的最后回返回这个Dialog。
在Dialog显示之前,Android也会调用回调函数onPripareDialog(int,Dialog),当你想在这个Dialog每次打开的时候一些属性得到改变,你可以定义这个方法,
这个方法会在每次Dialog打开的时候被调用,onCreateDialog()只会在Dialog第一次打开的时候被调用,如果你没有定义onPrepareDialog(),
每次返回的Dialog都是和第一次显示的Dialog一样,这个方法需要传递一个ID和在onCreateDialog()方法中创建的Dialog。
最好的定义onCreateDialog()和onPrepareDialog()中使用switch对传入的id进行下判断,每一个case对应着要启动的Dialog的ID
例
* 动态改变对话框值
* 关键点:onPrepareDialog方法 里面调用 removeDialog(id);
* 对话框调用执行顺序 showDialog() -> onCreateDialog() -> onPrepareDialog() -> removeDialog()
代码如下 | 复制代码 |
@Override public void onPrepareDialog(int id, Dialog dialog) { switch (id) { case (DIALOG_SORT_MAILS): removeDialog(id); //移出掉onCreateDialog()创建的Dialog break; } } |
上面讲到了Dialog,下面我来介绍android Dialog用法
一个Dialog一直被创建及作为Activity的一部分显示的时候,一般情况下,你应该使用回调方法onCreateDialog(int)创建Dialog,当你使用这个方法的时候,Android系统会自动的管理每一个Dialog的状态,并有效的控制着每个Dialog,同样的,每个Dialog也会继承Activity中的某些特性。就像当一个Dialog显示的时候,按下菜单键显示Activity定义的选项菜单或者使用音量键调整音视频音量的大小,当你想显示一个Dialog的时候,调用showDialog(int)方法,传递的参数是唯一能标识你想显示的对话框的整数。
当一个Dialog第一次被调用的时候,Android系统会调用你应该实例化Dialog的Activity的onCreateDialog方法,这个方法会启动你从showDialog(int)方法里面传递的那个ID参数所定义的Dialog,当你创建成功后,在方法的最后回返回这个Dialog。
在Dialog显示之前,Android也会调用回调函数onPripareDialog(int,Dialog),当你想在这个Dialog每次打开的时候一些属性得到改变,你可以定义这个方法,这个方法会在每次Dialog打开的时候被调用,onCreateDialog()只会在Dialog第一次打开的时候被调用,如果你没有定义onPrepareDialog(),每次返回的Dialog都是和第一次显示的Dialog一样,这个方法需要传递一个ID和在onCreateDialog()方法中创建的Dialog。
当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何
内部对象引用而且如果这个对话框正在显示,它将被消除。
最好的定义onCreateDialog()和onPrepareDialog()中使用switch对传入的id进行下判断,每一个case对应着要启动的Dialog的ID,像下面这个例子一样:
代码如下 | 复制代码 |
protected Dialog onCreateDialog(int id) |
解析XML文件:
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;
pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理;通过paser.nextText()方法可以获取下一个Text类型的节点的值;
读取XML
代码如下 | 复制代码 |
XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(xml, "UTF-8");//为破解器添加要解析的XML数据 int event = pullParser.getEventType();//开始读取,获取事件返回值 pullParser.getName();//获取节点名称 pullParser.getAttributeValue(0);//获取第一个属性的值 pullParser.nextText();//获取标签之后的节点的内容 event = pullParser.next(); |
//解析器遇到结束标签不会自动向下解析,需要调用此方法进行继续执行;
保存文件到XML
代码如下 | 复制代码 |
public static void save(List<Person> persons, OutputStream outStream) serializer.startTag(null, "persons");//设置开始标签,第一个参数为namespace serializer.startTag(null, "name"); serializer.startTag(null, "age"); serializer.endTag(null, "person"); |
解析xml
代码如下 | 复制代码 |
<?xml version="1.0" encoding="utf-8"?> |
然后我们分别使用以上三种解析技术解析文档,得到一个List<Book>的对象,先来看一下Book.java的代码:
代码如下 | 复制代码 |
package com.scott.xml.model; public class Book { public void setId(int id) { public String getName() { public void setName(String name) { public float getPrice() { public void setPrice(float price) { @Override |
最后,我们还要把这个集合对象中的数据生成一个新的XML文档,生成的XML结构跟原始文档略有不同,是下面这种格式:
代码如下 | 复制代码 |
<?xml version="1.0" encoding="UTF-8"?> |
接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:
代码如下 | 复制代码 |
package com.scott.xml.parser; import java.io.InputStream; import com.scott.xml.model.Book; public interface BookParser { |
.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。
代码如下 | 复制代码 |
public void payment() { SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); db.beginTransaction();//开始事务 try { db.execSQL("update person set amount=amount-10 where personid=2"); db.execSQL("update person set amount=amount+10 where personid=5"); db.setTransactionSuccessful();// 设置事务的标志为true,调用此方法会在执行到endTransaction()方法是提交事务,若没有调用此方法会在执行到endTransaction()方法回滚事务。 } catch (SQLException e) { } finally { db.endTransaction(); } // 结束事务,有两种情况:commit,rollback, // 事务的提交或回滚是由事务的标志决定的,如果事务的标志为true就会提交,否则回滚,默认情况下事务的标志为false } |
应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入
加事务处理,把5000条插入作为一个事务
我们使用SQLite的事务进行控制:
代码如下 | 复制代码 |
db.beginTransaction(); //手动设置开始事务 try{ //批量处理操作 for(Collection c:colls){ insert(db, c); } db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交 }catch(Exception e){ MyLog.printStackTraceString(e); }finally{ db.endTransaction(); //处理完成 } |
代码如下 | 复制代码 |
数据存储与访问常用方式: Activity(Context) Activity(Context)提供了openFileOutput(filename,mode)方法用于把数据输出到文件中; 如果希望文件被其它应用读和写:传入(Context.MODE_READABLE+Context.MODE_WRITEABLE) 例子 //写数据 FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE); byte [] bytes = writestr.getBytes(); fout.write(bytes); fout.close(); catch(Exception e){ //读数据 } //param 文件名称,操作方式 android有一套自己的安全模型,当应用程序(.apk)在安装时系统会分配给一个userid,当该应用去访问其它资源如文件的时候,会进行 userid的匹配,默认情况下任何应用创建的文件,sharedpreferences,数据库都是私有的(创建的文件保存在/data/data /<package name>/files目录下),只有指定操作模式为外部可读或写才可以被其它程序访问; 读取文件: <1> <2> ctrl + shift + x/y 大小写 从resource的raw中读取文件数据: String res = ""; //得到数据的大小 byte [] buffer = new byte[length]; //读取数据 //依test.txt的编码类型选择合适的编码,如果不调整会乱码 }catch(Exception e){ |
现在我来给大家总结一个实例
代码如下 | 复制代码 |
/** import java.io.FileInputStream; import android.content.Context; /** |
上面就可以实现对文件的读写操作了
相关文章
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
- 夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
- 一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
- 深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
- 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02