Android新手上路----用短信自动回复来电

这个学期刚刚上完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. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns: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. public final class R {  
  2.     public static final class attr {  
  3.     }  
  4.     public static final class drawable {  
  5.         public static final int icon=0x7f020000;  
  6.     }  
  7.     public static final class id {  
  8.         public static final int SMSText=0x7f050001;  
  9.         public static final int closeButton=0x7f050003;  
  10.         public static final int instruction=0x7f050004;  
  11.         public static final int lable=0x7f050000;  
  12.         public static final int startButton=0x7f050002;  
  13.     }  
  14.     public static final class layout {  
  15.         public static final int main=0x7f030000;  
  16.     }  
  17.     public static final class string {  
  18.         public static final int app_name=0x7f040001;  
  19.         public static final int closeButton=0x7f040005;  
  20.         public static final int default_SMSText=0x7f040002;  
  21.         public static final int instruction=0x7f040004;  
  22.         public static final int lable=0x7f040000;  
  23.         public static final int startButton=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. package com.myzhan;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.ContentResolver;  
  7. import android.database.Cursor;  
  8. import android.os.Bundle;  
  9. import android.provider.Contacts;  
  10. import android.telephony.*;  
  11. import android.view.View;  
  12. import android.widget.*;  
  13.   
  14. public class AutoSMS extends Activity {  
  15.       
  16.     private EditText SMSText = null;  
  17.     private Button startButton = null;  
  18.     private Button closeButton = null;  
  19.     private TextView instruction = null;  
  20.       
  21.     private ContentResolver content = null;  
  22.     private Cursor cursor = null;  
  23.     private ArrayList<String> nameList = null;  
  24.     private ArrayList<String> numberList = null;  
  25.     private TelephonyManager telephonyManager = null;  
  26.     private SmsManager smsManager = null;  
  27.       
  28.     private String incomingNumber = null;  
  29.     private boolean isMonitoring = false;  
  30.       
  31.     public void serviceControl(boolean isMonitoring){  
  32.         if(!isMonitoring){  
  33.             startService();  
  34.         }else{  
  35.             stopService();  
  36.         }  
  37.         this.isMonitoring = !this.isMonitoring;  
  38.     }  
  39.       
  40.     public void startService(){  
  41.           
  42.         /* 下面代码将联系人信息读取出来,再存放到名为nameList,numberList的两个ArrayList中。 
  43.          * 我觉得这种方法效率很低,期待更好的方法  
  44.          * */  
  45.         content = getContentResolver();     //获取一个ContentResolver对象,并不是new出来的  
  46.         cursor = content.query(Contacts.People.CONTENT_URI, nullnullnullnull);  
  47.         nameList = new ArrayList<String>(cursor.getCount());  
  48.         numberList = new ArrayList<String>(cursor.getCount());  
  49.           
  50.         for(int i=0; i<cursor.getCount() ;i++){  
  51.             cursor.moveToPosition(i);  
  52.             nameList.add(cursor.getString(cursor.getColumnIndex(Contacts.People.NAME)));  
  53.             numberList.add(cursor.getString(cursor.getColumnIndex(Contacts.People.NUMBER)));  
  54.         }  
  55.           
  56.         /* 设置一个监听通话状态的Listener 
  57.          * 如果状态有改变,先判断自动回复服务有没有启动,再判断是不是有来电 
  58.          * 如果满足“服务启动”和“有来电”两个条件,即发送自动回复的信息 
  59.          * */  
  60.         PhoneStateListener phoneListener = new PhoneStateListener(){  
  61.             @Override  
  62.             public void onCallStateChanged(int state,String incoming){  
  63.                 if(isMonitoring && state == TelephonyManager.CALL_STATE_RINGING){  
  64.                     incomingNumber = incoming;  
  65.                     sendSMS();  
  66.                 }  
  67.             }  
  68.         };  
  69.           
  70.         telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);  
  71.         telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);  
  72.         smsManager = SmsManager.getDefault();  
  73.         instruction.setText("自动回复已经启动");  
  74.     }  
  75.       
  76.     public void stopService(){  
  77.         /* 自动回复服务是否生效取决于isMonitoring的值 
  78.          * 不过这里可以做更多事情,例如将引用设置为null 
  79.          * */  
  80.         instruction.setText("自动回复已经停止");  
  81.     }  
  82.       
  83.     public void sendSMS(){  
  84.         /* 简单来说,发送一条短信只需要 
  85.          * SmsManager smsManager = SmsManager.getDefault(); 
  86.          * String smsText = "短信内容"; 
  87.          * String number = "对方号码"; 
  88.          * smsManager.sendTextMessage(incomingNumber, null, smsText, null, null); 
  89.          * */  
  90.         if(numberList.contains(incomingNumber));{  
  91.             String smsText = SMSText.getText().toString();  
  92.             smsManager.sendTextMessage(incomingNumber, null, smsText, nullnull);  
  93.             instruction.setText("已经发送短信");  
  94.         }  
  95.     }  
  96.       
  97.     /** Called when the activity is first created. */  
  98.     @Override  
  99.     public void onCreate(Bundle savedInstanceState) {  
  100.           
  101.         super.onCreate(savedInstanceState);  
  102.         setContentView(R.layout.main);  
  103.           
  104.         /* 这里就是和main.xml中的元素建立联系的时候啦! 
  105.          * */  
  106.         this.SMSText = (EditText)findViewById(R.id.SMSText);  
  107.         this.startButton = (Button)findViewById(R.id.startButton);  
  108.         this.closeButton = (Button)findViewById(R.id.closeButton);  
  109.         this.instruction = (TextView)findViewById(R.id.instruction);  
  110.           
  111.         /* 监听startButton点击事件的listener 
  112.          * 根据isMonitoring的布尔值来决定启动或者关闭服务 
  113.          * */  
  114.         startButton.setOnClickListener(new Button.OnClickListener()    
  115.         {    
  116.           @Override   
  117.           public void onClick(View v)    
  118.           {  
  119.               if(!isMonitoring){  
  120.                   startButton.setText("停止自动回复");  
  121.               }else{  
  122.                   startButton.setText("开始自动回复");  
  123.               }  
  124.               serviceControl(isMonitoring);  
  125.           }  
  126.         });  
  127.           
  128.         /* 关闭按钮,退出程序 
  129.          * */  
  130.         closeButton.setOnClickListener(new Button.OnClickListener()    
  131.         {    
  132.           @Override   
  133.           public void onClick(View v)    
  134.           {  
  135.               System.exit(0);  
  136.           }  
  137.         });  
  138.     }  
  139. }  

三.程序运行

程序运行效果如图所示:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值