`
he91_com
  • 浏览: 410804 次
文章分类
社区版块
存档分类
最新评论

主题:四,android四大组件基础介绍及打电话,发短信简单应用 &单元测试

 
阅读更多

1,本章是android入门最后一篇,从后面开始将进入进阶阶段。我也会加快更新速度。但愿能保持每天三篇博文的数量。但是是在保证质量的前提下。后面我还会发布一些实际开发中用到的应用案例。敬请关注!

应用组件是一个android应用程序的重要基石。每个组件的应用角度不同,各自负责所特有的功能。并非所有的组件都有实际的切入点,或许与别的组件相互依赖。但都作为一个独立的实体存在,起着特定的作用。有四种不同类型的应用组件。每种类型提供不同的用途,并各自拥有不同的生命周期。

所谓组件你可以这么理解。一个汽车的构成一般有发动机,变速箱,底盘,车身,悬挂这几部门组成。每一部分又都有独立的作用。这和android中得组件类似。

下面是四种类型的应用程序组件:

Activity

字面意思活动,其实就表示与用户交互的一块单屏幕。比如说短信应用程序可能有一个活动,显

示收发短信的列表,另一项活动,可以编写短信。他们是不同的两块屏幕。一个Activity是单独

的,它的关注点在于用户能做什么。几乎所有的Activity都与用户交互。在Android中一个程序可

以访问另一个程序中得某个Activity,这在其他语言程序中是不可想象的。极大的节省了系统资源。

所有的Activity必须在AndroidManifest.xml.清单文件中注册方可使用。

Service

服务是运行在后台的一个组件,提到服务你可能首先想到的是windows中的服务。它在后台默默

的为你提供着你需要的功能。Android中得服务其实与windows中得服务类似,它执行长时间运

行的操作,或运程进程执行工作。服务不提供用户界面,例如在后台下载东西,播放音乐,在你

播放音乐的同时还可以干其他事情,而不会阻塞用于与其他活动的交互。另一个组件,比如Activity

可以启动一个服务,并运行或者绑定到它。

ContentProvider

内容提供者主要用于应用程序的数据共享设置,你可以把数据存储在文件系统中,或者SQLite

据库上,网络,或者其他的持久性存储位置。你可以访问这些数据或者修改,其他应用程序也可

以访问或者修改。(当然这需要内容提供商的允许)。最典型的例子就是android程序中得通讯录

它就是通过内容提供者对外共享数据的。

BroadcastReceiver

广播接收者,其实和我们生活中得广播意思相近,在发生什么事情的时候,会以广播的形式告知

我们。广播又分为普通广播和有序广播。普通广播是异步的,理论上是同时收到的。你不能对他

做任何操作,不能终止。有序广播,在接收到广播时可以加入自己的操作,传递给下一个接收者,

也可以终止广播。举个例子温州动车追尾了,国家通过电视广播的方式同时告知了我们。你没

办法终止它,或者改变它。这属于普通广播。有序广播就是,比如张三的老婆郭美美在动车上,

国家通过电话通知张三:“你老婆很不幸在这次事故中丧生了”。张三可以在接到通知时终止它,

不告诉他丈母娘,也可以加入自己的操作,然后再告知丈母娘:“妈呀,美美在火车上出了点事,

在医院呢。”当然有序广播是有优先级的。国家打电话优先通知她老公。而不是她老母。这在后面

会详细讲解!Android系统中最常见的广播电池电量低得时候,收到短信的时候,USB连接的时

候等等。

先暂时介绍一下四大组件,进阶部分会有详尽讲解。多谢关注!下面来个简单的例子作为入门的结束!

先上图:





<!--EndFragment-->

打电话的主要代码:

Java代码 复制代码收藏代码
  1. mCall.setOnClickListener(newButton.OnClickListener(){
  2. @Override
  3. publicvoidonClick(Viewv){
  4. StringphoneNumber=mPhoneNumber.getText().toString();
  5. //意图用于激活组件,绑定数据。充当信使的作用
  6. Intentintent=newIntent();
  7. /*要执行的动作。执行不同的动作的Action去这找
  8. http://developer.android.com/reference/android/content/Intent.html*/
  9. intent.setAction("android.intent.action.CALL");
  10. //绑定数据
  11. intent.setData(Uri.parse("tel:"+phoneNumber));
  12. //激活打电话组件通过隐式意图另外不要忘记在清单文件中注册一下打电话的权限
  13. startActivity(intent);
  14. }
  15. });

发送短信的主要代码:

Java代码 复制代码收藏代码
  1. mSendButton.setOnClickListener(newButton.OnClickListener(){
  2. @Override
  3. publicvoidonClick(Viewv){
  4. StringphoneNumber=mPhoneNumber.getText().toString();
  5. Stringcontent=mMessage.getText().toString();
  6. //得到短信管理器
  7. SmsManagermanager=SmsManager.getDefault();
  8. //如果短信内容超过70个字将被分割成多条
  9. ArrayList<String>messages=manager.divideMessage(content);
  10. //循环发送
  11. for(Stringms:messages){
  12. //注:在模拟器中发送中文短信会乱码这跟底层的网络有关。不过到真机上就没事了。
  13. manager.sendTextMessage(phoneNumber,null,ms,null,null);
  14. Toast.makeText(getApplicationContext(),"发送成功!",0).show();
  15. }
  16. }
  17. });

之所以还会在讲这一点主要是 这是电话的最基本的两个功能,还有一点在很多应用中还是会用到这些的,比如在CRM,OA,SNS应用上都有可能用上这个功能。最典型的在CRM上,在客户资料上有电话号码这一项,你可以直接加一按钮就能拨打,总比再把号码记下来用内置的拨打吧。

2,在实际开发中,开发android应用程序的过程中是需要不断的进行单元测试的,使用JUnit测试框架,是正规android开发比用技术,良好的测试习惯,一是能减少后期维护和增强软件的健壮性。在JUnit中可以得到组件,可以模拟发送事件和检测程序处理的正确性。

其实android中也是扩展了JUnit,派生出好几个类倾向于不同情况下的测试。这一点与Spring中初始化容器相似,你可以通过BeanFactory也可以通过ApplicationContext来完成。只不过他们的倾向点不同。在android中你可以使用这些类来完成单元测试:

Test—TestCase—AndroidTestCase:多用于对业务逻辑的单元测试

Test—TestCase—InstrumentationTestCase:用于测试与组件交互的功能

Test—TestSuite—InstrumentationTestSuite:一组测试用例

TestListener——BaseTestRunner—AndroidTestRunner

InstrumentationInstrumentationTestRunner

我们常用到的一般是前前两个,你会发现他们的基类都是Test。只不过各自的应用场景不同。

第一步:在AndroidManifest.xml中加入下面蓝色代码:

<!--EndFragment-->
Xml代码 复制代码收藏代码
  1. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  2. <!--使用的类库-->
  3. <SPANstyle="COLOR:#0000ff"><uses-libraryandroid:name="android.test.runner"/></SPAN>
  4. <activityandroid:name="com.iteye.androidtoast.JUnitActivity"
  5. android:label="@string/app_name">
  6. <intent-filter>
  7. <actionandroid:name="android.intent.action.MAIN"/>
  8. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  9. </intent-filter>
  10. </activity>
  11. </application>
  12. <!--这里的targetPackage的内容与上面package内容需相同。表示该测试运行在此包下,说白了就是在同一个进程-->
  13. <SPANstyle="COLOR:#0000ff"><instrumentationandroid:name="android.test.InstrumentationTestRunner"
  14. android:targetPackage="com.iteye.androidtoast"android:label="TestsforMyApp"/></SPAN>

第二步,看代码

首先是AndroidTestCase的简单应用

Java代码 复制代码收藏代码
  1. packagecom.iteye.service.tests;
  2. importjunit.framework.Assert;
  3. importandroid.test.AndroidTestCase;
  4. importandroid.util.Log;
  5. importcom.iteye.service.SomeService;
  6. /**
  7. *需要测试类要继承AndroidTestCase
  8. *AndroidTestCase多用于对系统中业务逻辑的测试
  9. *需要与界面交互的测试一般采用InstrumentationTestCase
  10. *@authorandroidtoast
  11. *
  12. */
  13. publicclassSomeServiceTestextendsAndroidTestCase{
  14. privatestaticfinalStringTAG="SomeServiceTest";
  15. SomeServicesome;
  16. protectedinta;
  17. protectedintb;
  18. //初始化测试环境在实例化当前类的时候自动调用此方法
  19. @Override
  20. protectedvoidsetUp()throwsException{
  21. super.setUp();
  22. some=newSomeService();
  23. a=3;
  24. b=8;
  25. }
  26. //测试结束后调用此方法,用于清理测试环境中得变量
  27. @Override
  28. protectedvoidtearDown()throwsException{
  29. super.tearDown();
  30. Log.i(TAG,"TestOver!");
  31. }
  32. //测试getAdd方法
  33. publicvoidtestAdd()throwsException{
  34. Log.d(TAG,"testAdd");
  35. intresult=some.getAdd(a,b);
  36. Assert.assertEquals(11,result);
  37. }
  38. }

InstrumentationTestCase应用代码:

Java代码 复制代码收藏代码
  1. packagecom.iteye.androidtoast.tests;
  2. importcom.iteye.androidtoast.JUnitActivity;
  3. importcom.iteye.androidtoast.R;
  4. importandroid.content.Intent;
  5. importandroid.os.SystemClock;
  6. importandroid.test.InstrumentationTestCase;
  7. importandroid.view.View;
  8. importandroid.widget.Button;
  9. importandroid.widget.TextView;
  10. /**
  11. *InstrumentationTestCase多用于测试与组件相关的操作
  12. *@authorandroidtoast
  13. *
  14. */
  15. publicclassJUnitActivityTestextendsInstrumentationTestCase{
  16. JUnitActivitymActivityTested;
  17. publicJUnitActivityTest(){
  18. }
  19. /**
  20. *初始化测试环境
  21. */
  22. @Override
  23. protectedvoidsetUp()throwsException{
  24. super.setUp();
  25. //意图用于激活Activity
  26. Intentintent=newIntent();
  27. //设置用于激活哪个Activity
  28. intent.setClassName("com.iteye.androidtoast",JUnitActivity.class.getName());
  29. //启动一个新的任务并在后台运行
  30. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  31. //获得Instrumentation启动一个活动
  32. mActivityTested=(JUnitActivity)getInstrumentation().startActivitySync(intent);
  33. }
  34. //清理资源
  35. @Override
  36. protectedvoidtearDown()throwsException{
  37. mActivityTested.finish();//测试完成后关闭Activity
  38. super.tearDown();
  39. }
  40. //测试方法(其实就是一个点击按钮然后隐藏自身显示文本这么一简单功能)
  41. publicvoidtestClickButtonToShowText()throwsException{
  42. TextViewtv=(TextView)mActivityTested.findViewById(R.id.text);
  43. SystemClock.sleep(2000);//等待两秒
  44. //如果当前的TextView的状态是隐藏的则正确通过
  45. assertEquals("TextViewshouldbeGonebeforeButtonClicking",
  46. View.GONE,tv.getVisibility());
  47. Buttonbtn=(Button)mActivityTested.findViewById(R.id.button);
  48. //在主线程里执行点击按钮这一动作
  49. getInstrumentation().runOnMainSync(newPerformClick(btn));
  50. SystemClock.sleep(2000);
  51. assertEquals("TextViewshouldbeVisibleafterButtonClicking",
  52. View.VISIBLE,tv.getVisibility());
  53. }
  54. privateclassPerformClickimplementsRunnable{
  55. ButtonmBtnClicked;
  56. publicPerformClick(Buttonbutton){
  57. mBtnClicked=button;
  58. }
  59. publicvoidrun(){
  60. mBtnClicked.performClick();
  61. }
  62. }
  63. }

  • 大小: 44.8 KB
  • 大小: 46.3 KB
  • SMS.rar (417.4 KB)
  • 下载次数: 289
分享到:
评论

相关推荐

    四,android四大组件基础介绍及打电话,发短信简单应用 &单元测试

    在Android开发中,四大组件是构建应用程序的核心元素,它们分别是:Activity、Service、BroadcastReceiver以及ContentProvider。这四个组件各自承担着不同的职责,是Android系统交互的基础。 1. **Activity**: ...

    android四大组件学习教案.pptx

    Android 四大组件是构成Android应用程序的核心元素,它们包括Activity、Service、BroadcastReceiver和ContentProvider。本教程主要关注Activity的学习,Activity是用户与应用程序交互的主界面,也是应用程序的基本...

    android四大组件PPT学习教案.pptx

    《Android四大组件——Activity详解》 在Android应用开发中,Activity是构成应用程序核心的四大组件之一,它扮演着用户交互界面的重要角色。Activity提供了一个窗口,用户可以通过它与应用程序进行互动,例如打电话...

    Android应用框架与开发步骤

    Android应用框架是构建Android应用程序的基础,它包含了操作系统与应用程序之间的所有中间层,使得开发者能够创建功能丰富的移动应用。本文将详细讲解Android应用框架及其开发步骤。 首先,Android应用框架包括了多...

    android 定时打电话的小程序

    1. **Android系统服务(Service)**:Service是Android应用四大组件之一,用于在后台执行长时间运行的任务,比如定时任务。在这个定时打电话的小程序中,可能会创建一个Service来处理定时调用电话的逻辑,确保即使...

    安卓四个组件之一 广播使用

    在Android操作系统中,四大组件是应用开发的核心,它们分别是Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。本篇文章将深入探讨四大组件之一的...

    Android 19 SDK source

    - **框架层接口**:了解Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的底层实现。 - **硬件抽象层**(HAL):查看如何与硬件交互,如摄像头、GPS、Wi-Fi等。 - **权限管理**:理解...

    android 版本来电归属地查询

    Content Provider是Android四大组件之一,用于在应用程序之间共享数据。在这个项目中,自定义的Provider会暴露数据库中的来电归属地信息,供其他应用(比如来电显示应用)通过URI进行查询。编写Provider时,需要重写...

    Android学习路线和职业规划探讨.pdf

    首先,Android的学习路线应当从基础的知识体系开始,这包括了四大组件(Activity、Service、BroadcastReceiver、ContentProvider)、应用的布局和界面设计、自定义View的实现方法和动画的使用。深入的知识点则涉及到...

    Android通过内容提供者读取联系人

    在Android系统中,内容提供者(Content Provider)是Android四大组件之一,它是应用程序间数据共享的主要机制。通过内容提供者,一个应用可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个...

    android读取手机联系人

    ContentProvider是Android四大组件之一,用于在不同的应用程序之间共享数据。在这个场景下,我们将主要探讨如何利用ContentResolver来获取手机上的联系人及其电话号码。 首先,让我们了解ContentResolver的角色。...

    Android学习路线探讨.pdf

    **基本知识点**包括Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)、布局技术、自定义View以及动画等。这些是开发者必须熟练掌握的基础。 **深入知识点**则更加专业化,如Activity的...

    android面试题

    【Android面试题】涵盖了许多Android开发中的核心知识点,包括线程与进程的区别、垃圾收集、字符串拼接、线程创建、ANR处理、代码分裂、Activity生命周期、Android四大组件、Service生命周期、权限管理、布局管理、...

    全局事件BroadCast

    BroadcastReceiver是Android四大组件之一,用于监听系统或自定义广播事件。系统广播是由Android系统发送的,例如电池电量变化、网络状态改变;而自定义广播则是由应用程序自己定义并发送的。 2. **注册...

    Android手机为什么会越用越卡_蓝色1

    Android应用开发有四大组件,广播接收器(BroadcastReceiver)就是其中之一,它用来接收来自系统和应用中的广播,你也可以理解它是一个监听器,比如当电量变化时,系统会产生一条广播,接收到这条广播就能在电量低时...

    AnjoyoAndroid02章节考试题.pdf

    - Activity是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之一。 - 它通常作为一个Java类实现,负责创建用户界面。 - Activity用于提供用户交互界面,并且每个应用可以有多个...

    读取联系人

    在Android系统中,读取和管理联系人是常见的功能,涉及到的内容提供者(Content Provider)和Uri是Android四大组件之一,对于开发人员来说是必备的知识点。本案例将带你深入理解这两个概念及其应用。 首先,我们来...

Global site tag (gtag.js) - Google Analytics