这个学期刚刚上完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的部分内容:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns: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文件看看
- public final class R {
- public static final class attr {
- }
- public static final class drawable {
- public static final int icon=0x7f020000;
- }
- public static final class id {
- public static final int SMSText=0x7f050001;
- public static final int closeButton=0x7f050003;
- public static final int instruction=0x7f050004;
- public static final int lable=0x7f050000;
- public static final int startButton=0x7f050002;
- }
- public static final class layout {
- public static final int main=0x7f030000;
- }
- public static final class string {
- public static final int app_name=0x7f040001;
- public static final int closeButton=0x7f040005;
- public static final int default_SMSText=0x7f040002;
- public static final int instruction=0x7f040004;
- public static final int lable=0x7f040000;
- public static final int startButton=0x7f040003;
- }
- }
对照上面的xml文件,我们可以发现这两者之间存在着某种联系。我们现在只需知道main.xml中的元素已经被R.java管理起来了。在代码中我们可以用R.id.SMSText这样的方式来读取main.xml中的元素,对应着main.xml文件中的android:id="@+id/SMSText"
三.代码编写(需要介绍的内容都写在注释里面吧:D)
下面是Activity的代码:
- package com.myzhan;
- import java.util.ArrayList;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.provider.Contacts;
- import android.telephony.*;
- import android.view.View;
- import android.widget.*;
- public class AutoSMS extends Activity {
- private EditText SMSText = null;
- private Button startButton = null;
- private Button closeButton = null;
- private TextView instruction = null;
- private ContentResolver content = null;
- private Cursor cursor = null;
- private ArrayList<String> nameList = null;
- private ArrayList<String> numberList = null;
- private TelephonyManager telephonyManager = null;
- private SmsManager smsManager = null;
- private String incomingNumber = null;
- private boolean isMonitoring = false;
- public void serviceControl(boolean isMonitoring){
- if(!isMonitoring){
- startService();
- }else{
- stopService();
- }
- this.isMonitoring = !this.isMonitoring;
- }
- public void startService(){
- /* 下面代码将联系人信息读取出来,再存放到名为nameList,numberList的两个ArrayList中。
- * 我觉得这种方法效率很低,期待更好的方法
- * */
- content = getContentResolver(); //获取一个ContentResolver对象,并不是new出来的
- cursor = content.query(Contacts.People.CONTENT_URI, null, null, null, null);
- nameList = new ArrayList<String>(cursor.getCount());
- numberList = new ArrayList<String>(cursor.getCount());
- for(int i=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
- * 如果状态有改变,先判断自动回复服务有没有启动,再判断是不是有来电
- * 如果满足“服务启动”和“有来电”两个条件,即发送自动回复的信息
- * */
- PhoneStateListener phoneListener = new PhoneStateListener(){
- @Override
- public void onCallStateChanged(int state,String incoming){
- 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("自动回复已经启动");
- }
- public void stopService(){
- /* 自动回复服务是否生效取决于isMonitoring的值
- * 不过这里可以做更多事情,例如将引用设置为null
- * */
- instruction.setText("自动回复已经停止");
- }
- public void sendSMS(){
- /* 简单来说,发送一条短信只需要
- * SmsManager smsManager = SmsManager.getDefault();
- * String smsText = "短信内容";
- * String number = "对方号码";
- * smsManager.sendTextMessage(incomingNumber, null, smsText, null, null);
- * */
- if(numberList.contains(incomingNumber));{
- String smsText = SMSText.getText().toString();
- smsManager.sendTextMessage(incomingNumber, null, smsText, null, null);
- instruction.setText("已经发送短信");
- }
- }
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- 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(new Button.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- if(!isMonitoring){
- startButton.setText("停止自动回复");
- }else{
- startButton.setText("开始自动回复");
- }
- serviceControl(isMonitoring);
- }
- });
- /* 关闭按钮,退出程序
- * */
- closeButton.setOnClickListener(new Button.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- System.exit(0);
- }
- });
- }
- }
三.程序运行
程序运行效果如图所示:
原文地址:点击打开链接