这个学期刚刚上完Java的课程,所以在假期打算了解一下Android的开发,写了一个小程序之后发现Android的开发效率相当快。下面以我写的这个小软件为例子,和大家分享一下我的入门心得。

本文参加第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇

一.软件功能需求

有时候我们不方便接听电话,但是需要和对方说明情况,一般我们都会选择发短信回去。很多手机都有挂掉电话然后回复短信的功能,不过都需要我们手动操作。我的想法就是用一个软件来自动帮我们处理这个过程。


二.图形界面

在Android开发中一个很重要的元素就是Activity。在图形界面设计的时候,我暂时将Activity理解为一个画布,我们可以在Activity上面画上我们的软件界面。从Java语言的角度上来看,一个Activity其实就是一个class(类)。

以Eclipse为例,新建一个Android工程,可以在res/layout目录下面发现一个main.xml文件,这是Activity使用的默认文件,我们的Activity类通过类似的文件来构建界面。我们可以通过改写这个文件来达到设计界面的目的,也可以建立我们自己的xml文件,然后在Activity的onCreate方法中指定我们使用的xml文件。因为我现在要写的软件很简单,所以我们只使用一个Activity,改写main.xml文件来构建界面。下面就是main.xml的部分内容:

[html]view plaincopy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/lable"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/lable"
  12. />
  13. <EditText
  14. android:id="@+id/SMSText"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:text="@string/default_SMSText"
  18. />
  19. <Button
  20. android:id="@+id/startButton"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:text="@string/startButton"
  24. />
  25. </LinearLayout>

我们在软件界面中所需要的LinearLayout,TextView,Button,EditText等元素已经在上面列出来了。接下来该怎样将这些东西和代码联系起来呢?写代码用Java来解析xml,然后在Activity上面生成我们的元素?是的 ,不过这些工作SDK可以代劳了。接下来我们打开gen目录下的R.java文件看看

[java]view plaincopy
  1. publicfinalclassR{
  2. publicstaticfinalclassattr{
  3. }
  4. publicstaticfinalclassdrawable{
  5. publicstaticfinalinticon=0x7f020000;
  6. }
  7. publicstaticfinalclassid{
  8. publicstaticfinalintSMSText=0x7f050001;
  9. publicstaticfinalintcloseButton=0x7f050003;
  10. publicstaticfinalintinstruction=0x7f050004;
  11. publicstaticfinalintlable=0x7f050000;
  12. publicstaticfinalintstartButton=0x7f050002;
  13. }
  14. publicstaticfinalclasslayout{
  15. publicstaticfinalintmain=0x7f030000;
  16. }
  17. publicstaticfinalclassstring{
  18. publicstaticfinalintapp_name=0x7f040001;
  19. publicstaticfinalintcloseButton=0x7f040005;
  20. publicstaticfinalintdefault_SMSText=0x7f040002;
  21. publicstaticfinalintinstruction=0x7f040004;
  22. publicstaticfinalintlable=0x7f040000;
  23. publicstaticfinalintstartButton=0x7f040003;
  24. }
  25. }

对照上面的xml文件,我们可以发现这两者之间存在着某种联系。我们现在只需知道main.xml中的元素已经被R.java管理起来了。在代码中我们可以用R.id.SMSText这样的方式来读取main.xml中的元素,对应着main.xml文件中的android:id="@+id/SMSText"


三.代码编写(需要介绍的内容都写在注释里面吧:D)

下面是Activity的代码:

[java]view plaincopy
  1. packagecom.myzhan;
  2. importjava.util.ArrayList;
  3. importandroid.app.Activity;
  4. importandroid.content.ContentResolver;
  5. importandroid.database.Cursor;
  6. importandroid.os.Bundle;
  7. importandroid.provider.Contacts;
  8. importandroid.telephony.*;
  9. importandroid.view.View;
  10. importandroid.widget.*;
  11. publicclassAutoSMSextendsActivity{
  12. privateEditTextSMSText=null;
  13. privateButtonstartButton=null;
  14. privateButtoncloseButton=null;
  15. privateTextViewinstruction=null;
  16. privateContentResolvercontent=null;
  17. privateCursorcursor=null;
  18. privateArrayList<String>nameList=null;
  19. privateArrayList<String>numberList=null;
  20. privateTelephonyManagertelephonyManager=null;
  21. privateSmsManagersmsManager=null;
  22. privateStringincomingNumber=null;
  23. privatebooleanisMonitoring=false;
  24. publicvoidserviceControl(booleanisMonitoring){
  25. if(!isMonitoring){
  26. startService();
  27. }else{
  28. stopService();
  29. }
  30. this.isMonitoring=!this.isMonitoring;
  31. }
  32. publicvoidstartService(){
  33. /*下面代码将联系人信息读取出来,再存放到名为nameList,numberList的两个ArrayList中。
  34. *我觉得这种方法效率很低,期待更好的方法
  35. **/
  36. content=getContentResolver();//获取一个ContentResolver对象,并不是new出来的
  37. cursor=content.query(Contacts.People.CONTENT_URI,null,null,null,null);
  38. nameList=newArrayList<String>(cursor.getCount());
  39. numberList=newArrayList<String>(cursor.getCount());
  40. for(inti=0;i<cursor.getCount();i++){
  41. cursor.moveToPosition(i);
  42. nameList.add(cursor.getString(cursor.getColumnIndex(Contacts.People.NAME)));
  43. numberList.add(cursor.getString(cursor.getColumnIndex(Contacts.People.NUMBER)));
  44. }
  45. /*设置一个监听通话状态的Listener
  46. *如果状态有改变,先判断自动回复服务有没有启动,再判断是不是有来电
  47. *如果满足“服务启动”和“有来电”两个条件,即发送自动回复的信息
  48. **/
  49. PhoneStateListenerphoneListener=newPhoneStateListener(){
  50. @Override
  51. publicvoidonCallStateChanged(intstate,Stringincoming){
  52. if(isMonitoring&&state==TelephonyManager.CALL_STATE_RINGING){
  53. incomingNumber=incoming;
  54. sendSMS();
  55. }
  56. }
  57. };
  58. telephonyManager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
  59. telephonyManager.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
  60. smsManager=SmsManager.getDefault();
  61. instruction.setText("自动回复已经启动");
  62. }
  63. publicvoidstopService(){
  64. /*自动回复服务是否生效取决于isMonitoring的值
  65. *不过这里可以做更多事情,例如将引用设置为null
  66. **/
  67. instruction.setText("自动回复已经停止");
  68. }
  69. publicvoidsendSMS(){
  70. /*简单来说,发送一条短信只需要
  71. *SmsManagersmsManager=SmsManager.getDefault();
  72. *StringsmsText="短信内容";
  73. *Stringnumber="对方号码";
  74. *smsManager.sendTextMessage(incomingNumber,null,smsText,null,null);
  75. **/
  76. if(numberList.contains(incomingNumber));{
  77. StringsmsText=SMSText.getText().toString();
  78. smsManager.sendTextMessage(incomingNumber,null,smsText,null,null);
  79. instruction.setText("已经发送短信");
  80. }
  81. }
  82. /**Calledwhentheactivityisfirstcreated.*/
  83. @Override
  84. publicvoidonCreate(BundlesavedInstanceState){
  85. super.onCreate(savedInstanceState);
  86. setContentView(R.layout.main);
  87. /*这里就是和main.xml中的元素建立联系的时候啦!
  88. **/
  89. this.SMSText=(EditText)findViewById(R.id.SMSText);
  90. this.startButton=(Button)findViewById(R.id.startButton);
  91. this.closeButton=(Button)findViewById(R.id.closeButton);
  92. this.instruction=(TextView)findViewById(R.id.instruction);
  93. /*监听startButton点击事件的listener
  94. *根据isMonitoring的布尔值来决定启动或者关闭服务
  95. **/
  96. startButton.setOnClickListener(newButton.OnClickListener()
  97. {
  98. @Override
  99. publicvoidonClick(Viewv)
  100. {
  101. if(!isMonitoring){
  102. startButton.setText("停止自动回复");
  103. }else{
  104. startButton.setText("开始自动回复");
  105. }
  106. serviceControl(isMonitoring);
  107. }
  108. });
  109. /*关闭按钮,退出程序
  110. **/
  111. closeButton.setOnClickListener(newButton.OnClickListener()
  112. {
  113. @Override
  114. publicvoidonClick(Viewv)
  115. {
  116. System.exit(0);
  117. }
  118. });
  119. }
  120. }

三.程序运行

程序运行效果如图所示:


更多相关文章

  1. 在Android下创建文件夹
  2. android工程中的R.java文件
  3. Android文件选择器
  4. cocos2dx通过Jni调用Android的Java层代码(上)
  5. Android Studio解决未识别Java文件(出现红J)问题
  6. 200行Java代码实现Android下的视频通话

随机推荐

  1. Android通用流行框架大全
  2. 浅入浅出Android(012):Android下的计时器
  3. Android(安卓):Kernel Uevent发送(热插拔)事
  4. Android笔记----禁止横竖屏切换
  5. android基础--TextView详解
  6. Android 禁止切屏
  7. 【Android】自定义View实现信封红蓝边/收
  8. #Android项目# ——day03 Android(安卓)
  9. Wear OS手表应用开发教程之-创建环形滚动
  10. Android(安卓)IPC 机制详解:IBinder