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

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

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

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

Activity 

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

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

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

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

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

    Service  

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

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

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

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

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

   ContentProvider

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

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

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

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

   BroadcastReceiver

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

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

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

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

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

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

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

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

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

      候等等。

 

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

先上图:

 



 


 

打电话的主要代码:

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

 发送短信的主要代码:

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

 之所以还会在讲这一点主要是 这是电话的最基本的两个功能,还有一点在很多应用中还是会用到这些的,比如在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中加入下面蓝色代码:

Xml代码  
  1. <application android:icon="@drawable/icon" android:label="@string/app_name">  
  2.           
  3.         <SPAN style="COLOR: #0000ff"><uses-library android:name="android.test.runner"/>SPAN>  
  4.         <activity android:name="com.iteye.androidtoast.JUnitActivity"  
  5.                   android:label="@string/app_name">  
  6.             <intent-filter>  
  7.                 <action android:name="android.intent.action.MAIN" />  
  8.                 <category android:name="android.intent.category.LAUNCHER" />  
  9.             intent-filter>  
  10.         activity>  
  11.   
  12.     application>  
  13.       
  14.     <SPAN style="COLOR: #0000ff"><instrumentation android:name="android.test.InstrumentationTestRunner"  
  15.      android:targetPackage="com.iteye.androidtoast" android:label="Tests for My App" />SPAN>  

 第二步,看代码

  首先是AndroidTestCase的简单应用

  

Java代码  
  1. package com.iteye.service.tests;   
  2.   
  3. import junit.framework.Assert;   
  4. import android.test.AndroidTestCase;   
  5. import android.util.Log;   
  6.   
  7. import com.iteye.service.SomeService;   
  8. /**  
  9.  * 需要测试类要继承AndroidTestCase  
  10.  * AndroidTestCase 多用于对系统中业务逻辑的测试  
  11.  * 需要与界面交互的测试一般采用InstrumentationTestCase  
  12.  * @author androidtoast  
  13.  *  
  14.  */  
  15. public class SomeServiceTest extends AndroidTestCase {   
  16.        
  17.     private static final String TAG="SomeServiceTest";   
  18.     SomeService some;   
  19.     protected int a;   
  20.     protected int b;   
  21.        
  22.     //初始化测试环境 在实例化当前类的时候自动调用此方法   
  23.     @Override  
  24.     protected void setUp() throws Exception {   
  25.             super.setUp();   
  26.             some=new SomeService();   
  27.             a=3;   
  28.             b=8;   
  29.     }   
  30.   
  31.     //测试结束后调用此方法,用于清理测试环境中得变量   
  32.     @Override  
  33.     protected void tearDown() throws Exception {   
  34.         super.tearDown();   
  35.         Log.i(TAG, "Test Over!");   
  36.     }   
  37.   
  38.     //测试getAdd方法   
  39.     public void testAdd()throws Exception{   
  40.         Log.d(TAG, "testAdd");   
  41.         int result=some.getAdd(a, b);   
  42.         Assert.assertEquals(11, result);   
  43.     }   
  44. }  
package com.iteye.service.tests;import junit.framework.Assert;import android.test.AndroidTestCase;import android.util.Log;import com.iteye.service.SomeService;/** * 需要测试类要继承AndroidTestCase * AndroidTestCase 多用于对系统中业务逻辑的测试 * 需要与界面交互的测试一般采用InstrumentationTestCase * @author androidtoast * */public class SomeServiceTest extends AndroidTestCase {private static final String TAG="SomeServiceTest";SomeService some;protected int a;protected int b;//初始化测试环境 在实例化当前类的时候自动调用此方法@Overrideprotected void setUp() throws Exception {super.setUp();some=new SomeService();a=3;b=8;}//测试结束后调用此方法,用于清理测试环境中得变量@Overrideprotected void tearDown() throws Exception {super.tearDown();Log.i(TAG, "Test Over!");}//测试getAdd方法public void testAdd()throws Exception{Log.d(TAG, "testAdd");int result=some.getAdd(a, b);Assert.assertEquals(11, result);}}

 

  InstrumentationTestCase应用代码:

    

Java代码  
  1. package com.iteye.androidtoast.tests;   
  2.   
  3. import com.iteye.androidtoast.JUnitActivity;   
  4. import com.iteye.androidtoast.R;   
  5.   
  6. import android.content.Intent;   
  7. import android.os.SystemClock;   
  8. import android.test.InstrumentationTestCase;   
  9. import android.view.View;   
  10. import android.widget.Button;   
  11. import android.widget.TextView;    
  12. /**  
  13.  * InstrumentationTestCase多用于测试与组件相关的操作  
  14.  * @author androidtoast  
  15.  *  
  16.  */  
  17. public class JUnitActivityTest extends InstrumentationTestCase {   
  18.   
  19.     JUnitActivity mActivityTested;   
  20.        
  21.     public JUnitActivityTest() {   
  22.     }   
  23.   
  24.     /**  
  25.      * 初始化测试环境  
  26.      */  
  27.     @Override  
  28.     protected void setUp() throws Exception {   
  29.         super.setUp();   
  30.         //意图用于激活Activity   
  31.         Intent intent = new Intent();   
  32.         //设置用于激活哪个Activity   
  33.         intent.setClassName("com.iteye.androidtoast", JUnitActivity.class.getName());   
  34.         //启动一个新的任务 并在后台运行   
  35.         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   
  36.         //获得Instrumentation 启动一个活动   
  37.         mActivityTested = (JUnitActivity) getInstrumentation().startActivitySync(intent);   
  38.     }   
  39.   
  40.     //清理资源    
  41.     @Override  
  42.     protected void tearDown() throws Exception {   
  43.         mActivityTested.finish();//测试完成后关闭Activity   
  44.         super.tearDown();   
  45.     }   
  46.     //测试方法 (其实就是一个点击按钮 然后隐藏自身显示文本这么一简单功能)   
  47.     public void testClickButtonToShowText() throws Exception {   
  48.         TextView tv = (TextView) mActivityTested.findViewById(R.id.text);   
  49.         SystemClock.sleep(2000);//等待两秒   
  50.         //如果当前的TextView的状态是隐藏的则正确通过   
  51.         assertEquals("TextView should be Gone before Button Clicking",   
  52.                 View.GONE, tv.getVisibility());   
  53.            
  54.         Button btn = (Button) mActivityTested.findViewById(R.id.button);   
  55.         //在主线程里执行点击按钮这一动作   
  56.         getInstrumentation().runOnMainSync(new PerformClick(btn));   
  57.         SystemClock.sleep(2000);   
  58.         assertEquals("TextView should be Visible after Button Clicking",   
  59.                 View.VISIBLE, tv.getVisibility());         
  60.     }   
  61.        
  62.     private class PerformClick implements Runnable {   
  63.         Button mBtnClicked;   
  64.            
  65.         public PerformClick(Button button) {   
  66.             mBtnClicked = button;   
  67.         }   
  68.            
  69.         public void run() {   
  70.             mBtnClicked.performClick();   
  71.         }   
  72.     }   
  73.   
  74. }  
package com.iteye.androidtoast.tests;import com.iteye.androidtoast.JUnitActivity;import com.iteye.androidtoast.R;import android.content.Intent;import android.os.SystemClock;import android.test.InstrumentationTestCase;import android.view.View;import android.widget.Button;import android.widget.TextView; /** * InstrumentationTestCase多用于测试与组件相关的操作 * @author androidtoast * */public class JUnitActivityTest extends InstrumentationTestCase {    JUnitActivity mActivityTested;public JUnitActivityTest() {}/** * 初始化测试环境 */@Overrideprotected void setUp() throws Exception {super.setUp();//意图用于激活ActivityIntent intent = new Intent();//设置用于激活哪个Activityintent.setClassName("com.iteye.androidtoast", JUnitActivity.class.getName());//启动一个新的任务 并在后台运行intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//获得Instrumentation 启动一个活动mActivityTested = (JUnitActivity) getInstrumentation().startActivitySync(intent);}//清理资源 @Overrideprotected void tearDown() throws Exception {mActivityTested.finish();//测试完成后关闭Activitysuper.tearDown();}//测试方法 (其实就是一个点击按钮 然后隐藏自身显示文本这么一简单功能)public void testClickButtonToShowText() throws Exception {TextView tv = (TextView) mActivityTested.findViewById(R.id.text);SystemClock.sleep(2000);//等待两秒//如果当前的TextView的状态是隐藏的则正确通过assertEquals("TextView should be Gone before Button Clicking",View.GONE, tv.getVisibility());Button btn = (Button) mActivityTested.findViewById(R.id.button);//在主线程里执行点击按钮这一动作getInstrumentation().runOnMainSync(new PerformClick(btn));SystemClock.sleep(2000);assertEquals("TextView should be Visible after Button Clicking",View.VISIBLE, tv.getVisibility());}private class PerformClick implements Runnable {Button mBtnClicked;public PerformClick(Button button) {mBtnClicked = button;}public void run() {mBtnClicked.performClick();}}}

 

  • 大小: 44.8 KB
  • 大小: 46.3 KB
  • Phone.rar (416.2 KB)
  • 下载次数: 233
  • JunitTest.rar (423.2 KB)
  • 下载次数: 323
  • SMS.rar (417.4 KB)
  • 下载次数: 289
  • 查看图片附件

更多相关文章

  1. tcping测试服务器TCP端口
  2. Android(安卓)组件样式定制方法详解
  3. 用DownLoadManage封装一个App的更新组件(兼容android 6、7、8)
  4. 简单轻松!通过USB数据线,让Android(安卓)Studio连接到自己的安卓手
  5. Android单元测试/Ui测试+JaCoCo覆盖率统计
  6. 局域网内android设备发现及通讯
  7. Flutter学习六之实现一个带筛选的列表页面
  8. Android(三)数据存储之XML解析技术
  9. Android(安卓)组件化实现

随机推荐

  1. Android(安卓)离线安装宝典
  2. [Android]Android Design之Navigation Dr
  3. Android日志系统Logcat源代码简要分析
  4. Android专家课程——课后小记
  5. Android开发者的演示工具——asm.jar
  6. Android 设备管理API概览(Device Administ
  7. Android的Activity屏幕切换动画(一)-左右
  8. 解析ANDROID ps命令执行后各项参数的含义
  9. android 开发-数据存储之文件存储
  10. Android(安卓)Studio Error: null, Canno