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
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:id="@+id/lable"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/lable"
- />
- <EditText
- android:id="@+id/SMSText"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/default_SMSText"
- />
- <Button
- android:id="@+id/startButton"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/startButton"
- />
- </LinearLayout>
我们在软件界面中所需要的LinearLayout,TextView,Button,EditText等元素已经在上面列出来了。接下来该怎样将这些东西和代码联系起来呢?写代码用Java来解析xml,然后在Activity上面生成我们的元素?是的 ,不过这些工作SDK可以代劳了。接下来我们打开gen目录下的R.java文件看看
[java]view plaincopy
- publicfinalclassR{
- publicstaticfinalclassattr{
- }
- publicstaticfinalclassdrawable{
- publicstaticfinalinticon=0x7f020000;
- }
- publicstaticfinalclassid{
- publicstaticfinalintSMSText=0x7f050001;
- publicstaticfinalintcloseButton=0x7f050003;
- publicstaticfinalintinstruction=0x7f050004;
- publicstaticfinalintlable=0x7f050000;
- publicstaticfinalintstartButton=0x7f050002;
- }
- publicstaticfinalclasslayout{
- publicstaticfinalintmain=0x7f030000;
- }
- publicstaticfinalclassstring{
- publicstaticfinalintapp_name=0x7f040001;
- publicstaticfinalintcloseButton=0x7f040005;
- publicstaticfinalintdefault_SMSText=0x7f040002;
- publicstaticfinalintinstruction=0x7f040004;
- publicstaticfinalintlable=0x7f040000;
- publicstaticfinalintstartButton=0x7f040003;
- }
- }
对照上面的xml文件,我们可以发现这两者之间存在着某种联系。我们现在只需知道main.xml中的元素已经被R.java管理起来了。在代码中我们可以用R.id.SMSText这样的方式来读取main.xml中的元素,对应着main.xml文件中的android:id="@+id/SMSText"
三.代码编写(需要介绍的内容都写在注释里面吧:D)
下面是Activity的代码:
[java]view plaincopy
- packagecom.myzhan;
- importjava.util.ArrayList;
- importandroid.app.Activity;
- importandroid.content.ContentResolver;
- importandroid.database.Cursor;
- importandroid.os.Bundle;
- importandroid.provider.Contacts;
- importandroid.telephony.*;
- importandroid.view.View;
- importandroid.widget.*;
- publicclassAutoSMSextendsActivity{
- privateEditTextSMSText=null;
- privateButtonstartButton=null;
- privateButtoncloseButton=null;
- privateTextViewinstruction=null;
- privateContentResolvercontent=null;
- privateCursorcursor=null;
- privateArrayList<String>nameList=null;
- privateArrayList<String>numberList=null;
- privateTelephonyManagertelephonyManager=null;
- privateSmsManagersmsManager=null;
- privateStringincomingNumber=null;
- privatebooleanisMonitoring=false;
- publicvoidserviceControl(booleanisMonitoring){
- if(!isMonitoring){
- startService();
- }else{
- stopService();
- }
- this.isMonitoring=!this.isMonitoring;
- }
- publicvoidstartService(){
- /*下面代码将联系人信息读取出来,再存放到名为nameList,numberList的两个ArrayList中。
- *我觉得这种方法效率很低,期待更好的方法
- **/
- content=getContentResolver();//获取一个ContentResolver对象,并不是new出来的
- cursor=content.query(Contacts.People.CONTENT_URI,null,null,null,null);
- nameList=newArrayList<String>(cursor.getCount());
- numberList=newArrayList<String>(cursor.getCount());
- for(inti=0;i<cursor.getCount();i++){
- cursor.moveToPosition(i);
- nameList.add(cursor.getString(cursor.getColumnIndex(Contacts.People.NAME)));
- numberList.add(cursor.getString(cursor.getColumnIndex(Contacts.People.NUMBER)));
- }
- /*设置一个监听通话状态的Listener
- *如果状态有改变,先判断自动回复服务有没有启动,再判断是不是有来电
- *如果满足“服务启动”和“有来电”两个条件,即发送自动回复的信息
- **/
- PhoneStateListenerphoneListener=newPhoneStateListener(){
- @Override
- publicvoidonCallStateChanged(intstate,Stringincoming){
- if(isMonitoring&&state==TelephonyManager.CALL_STATE_RINGING){
- incomingNumber=incoming;
- sendSMS();
- }
- }
- };
- telephonyManager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
- telephonyManager.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
- smsManager=SmsManager.getDefault();
- instruction.setText("自动回复已经启动");
- }
- publicvoidstopService(){
- /*自动回复服务是否生效取决于isMonitoring的值
- *不过这里可以做更多事情,例如将引用设置为null
- **/
- instruction.setText("自动回复已经停止");
- }
- publicvoidsendSMS(){
- /*简单来说,发送一条短信只需要
- *SmsManagersmsManager=SmsManager.getDefault();
- *StringsmsText="短信内容";
- *Stringnumber="对方号码";
- *smsManager.sendTextMessage(incomingNumber,null,smsText,null,null);
- **/
- if(numberList.contains(incomingNumber));{
- StringsmsText=SMSText.getText().toString();
- smsManager.sendTextMessage(incomingNumber,null,smsText,null,null);
- instruction.setText("已经发送短信");
- }
- }
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /*这里就是和main.xml中的元素建立联系的时候啦!
- **/
- this.SMSText=(EditText)findViewById(R.id.SMSText);
- this.startButton=(Button)findViewById(R.id.startButton);
- this.closeButton=(Button)findViewById(R.id.closeButton);
- this.instruction=(TextView)findViewById(R.id.instruction);
- /*监听startButton点击事件的listener
- *根据isMonitoring的布尔值来决定启动或者关闭服务
- **/
- startButton.setOnClickListener(newButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- if(!isMonitoring){
- startButton.setText("停止自动回复");
- }else{
- startButton.setText("开始自动回复");
- }
- serviceControl(isMonitoring);
- }
- });
- /*关闭按钮,退出程序
- **/
- closeButton.setOnClickListener(newButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- System.exit(0);
- }
- });
- }
- }
三.程序运行
程序运行效果如图所示:
原文地址:点击打开链接
更多相关文章
- 在Android下创建文件夹
- android工程中的R.java文件
- Android文件选择器
- cocos2dx通过Jni调用Android的Java层代码(上)
- Android Studio解决未识别Java文件(出现红J)问题
- 200行Java代码实现Android下的视频通话