= 电话拨号器/点击事件写法 = 
 
 
 
 
  开发安卓应用步骤: 
 
 
 
 
      - 1. 写UI, 即布局文件. 
 
 
 
 
      - 2. 写代码, Activity, ContentProvider, Service, 等等. 
 
 
 
 
      - 3. 在清单文件中配置 Activity 等四大组件. 
 
 
 
 
      - 4. 在清单文件中添加权限. 
 
 
 
 
    
 
 
 
 
  下面开发一个电话拨号器应用. 
 
 
 
 
    
 
 
 
 
  首先是写布局文件: 
 
 
 
 
  {{{class="brush:xml" 
 
 
 
 
  <?xml version="1.0" encoding="utf-8" ?> 
 
 
 
 
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
 
 
 
      android:layout_width="fill_parent" 
 
 
 
 
      android:layout_height="fill_parent" 
 
 
 
 
      android:orientation="vertical" > 
 
 
 
 
      <TextView 
 
 
 
 
          android:id="@+id/textView1" 
 
 
 
 
          android:layout_width="wrap_content" 
 
 
 
 
          android:layout_height="wrap_content" 
 
 
 
 
          android:text="@string/app_name" 
 
 
 
 
          android:textAppearance="?android:attr/textAppearanceLarge" /> 
 
 
 
 
      <EditText 
 
 
 
 
          android:id="@+id/et_phone" 
 
 
 
 
          android:layout_width="match_parent" 
 
 
 
 
          android:layout_height="wrap_content" 
 
 
 
 
          android:ems="10" 
 
 
 
 
          android:inputType="phone" > 
 
 
 
 
          <requestFocus /> 
 
 
 
 
      </EditText> 
 
 
 
 
      <Button 
 
 
 
 
          android:id="@+id/bt_call" 
 
 
 
 
          android:layout_width="wrap_content" 
 
 
 
 
          android:layout_height="wrap_content" 
 
 
 
 
          android:text="@string/call" /> 
 
 
 
 
  </LinearLayout> 
 
 
 
 
  }}} 
 
 
 
 
  怎样给控件起名字? 在布局文件中 "@" 表示 R 文件, "@+id" 就表示在R文件中加一个id, 
 
 
 
 
  控件的名字一般是 "缩写_描述" . 
 
 
 
 
    
 
 
 
 
  Activity中的代码如下: 
 
 
 
 
  {{{class="brush:java" 
 
 
 
 
  public class MainActivity extends Activity implements OnClickListener{ 
 
 
 
 
      // 将 控件作为字段是为了方便内部类访问, 而避免了多次的查询, 且节省内存. 
 
 
 
 
      private EditText et_phone; 
 
 
 
 
      /** 
 
 
 
 
       * activity创建的时候 调用 onCreate 方法, 且只调用一次. 
 
 
 
 
       */ 
 
 
 
 
      @Override 
 
 
 
 
      protected void onCreate(Bundle savedInstanceState) { 
 
 
 
 
          super.onCreate(savedInstanceState); 
 
 
 
 
          // 根据布局,显示activity的界面, 在res目录下layout目录下有一个xml定义的布局文件 
 
 
 
 
          setContentView(R.layout.activity_main); 
 
 
 
 
          // 查找到需要使用的控件 
 
 
 
 
          Button button = (Button) findViewById(R.id.bt_call); 
 
 
 
 
          et_phone = (EditText) findViewById(R.id.et_phone); 
 
 
 
 
          // 为按钮设置点击事件. 需要一个事件监听器 
 
 
 
 
          //button.setOnClickListener(new MyOnClickListener()); 
 
 
 
 
    
 
 
 
 
          // 点击事件写法 2: 使用匿名内部类. 
 
 
 
 
          /*button.setOnClickListener(new OnClickListener() { 
 
 
 
 
              @Override 
 
 
 
 
              public void onClick(View v) { 
 
 
 
 
                  callPhone(); 
 
 
 
 
              } 
 
 
 
 
          });*/ 
 
 
 
 
    
 
 
 
 
          // 点击事件写法 3: 让这个Activity本身实现 OnClickListener 接口 
 
 
 
 
          //button.setOnClickListener(this); 
 
 
 
 
      } 
 
 
 
 
    
 
 
 
 
      // 点击事件写法 1: 使用内部类. 
 
 
 
 
      private class MyOnClickListener implements OnClickListener { 
 
 
 
 
          @Override 
 
 
 
 
          public void onClick(View v) { 
 
 
 
 
              callPhone(); 
 
 
 
 
          } 
 
 
 
 
      } 
 
 
 
 
    
 
 
 
 
      // 点击事件写法 3: 让这个Activity本身实现 OnClickListener 接口, 这个最常用 
 
 
 
 
      @Override 
 
 
 
 
      public void onClick(View v) { 
 
 
 
 
          callPhone(); 
 
 
 
 
      } 
 
 
 
 
    
 
 
 
 
      // 点击事件写法 4: 在布局文件中的控件上添加属性 android:onClick=xxx, 
 
 
 
 
      // 然后在activity中写对应的方法. 注意必须是 public 的方法, 而且参数一定要为 View v !!! 
 
 
 
 
      // 这个View代表的是发生点击事件的控件 
 
 
 
 
      public void dialPhone(View view) { 
 
 
 
 
          callPhone(); 
 
 
 
 
      } 
 
 
 
 
    
 
 
 
 
      private void callPhone() { 
 
 
 
 
          String phone = et_phone.getText().toString().trim(); 
 
 
 
 
          if ("".equals(phone)) { 
 
 
 
 
              // 注意吐司一定不要忘了 show !! 
 
 
 
 
              Toast.makeText(MainActivity.this, "电话号码不能为空", 
 
 
 
 
                      Toast.LENGTH_SHORT).show(); 
 
 
 
 
          } else { 
 
 
 
 
              // 拨打电话 激活系统的拨号应用 把电话号码传给系统的应用. 
 
 
 
 
              // 打人 打酱油 动作+数据 就是一个完整的行为. 
 
 
 
 
              Intent intent = new Intent(); // 创建一个意图 
 
 
 
 
              intent.setAction(Intent.ACTION_CALL); // 为意图设置动作 
 
 
 
 
              intent.setData(Uri.parse("tel://" + phone)); // 为意图设置数据. 
 
 
 
 
              startActivity(intent); // 将此意图以一个 Activity 的形式启动起来.. 
 
 
 
 
          } 
 
 
 
 
      } 
 
 
 
 
  } 
 
 
 
 
  }}} 
 
 
 
 
  在清单文件中配置 Activity, 这一步在创建工程时eclipse自动做了. 
 
 
 
 
  另外就是要加入权限. 
 
 
 
 
  {{{class="brush:xml" 
 
 
 
 
      <uses-permission android:name="android.permission.CALL_PHONE"/> 
 
 
 
 
  }}} 
 
 
 
 
  至此, 电话拨号器完成. 
 
 
 
 
    
 
 
 
 
  -------------- 
 
 
 
 
  打电话, 基带? Socket? ip + 端口号? 
 
 
 
 
  -------------- 
 
 
 
 
  
 
 
 
   == 关于上下文 == 
  
 
  
 
   this 和 getApplicationContext() 
  
 
  
 
   对话框是activity的一部分, 它一定要被挂载在activity上 
  
 
  
 
     
  
 
  
 
    == 给应用改图标??? == 
   
 
   
 
    在res目录下的drawable目录中放一张png格式图片xxx,然后把manifest文件中application标签下的 
   
 
   
 
    activity标签的android:icon属性改为android:icon="@drawable/xxx"即可. 
   
 
   
 
      
   
 
   
 
    intent-filter:activity的子标签,是activity的一个配置信息,作用是在luncher程序里面生成一个应用程序的图标 
   
 
   
 
    {{{class="brush:java" 
   
 
   
 
        <intent-filter > 
   
 
   
 
            <action android:name="android.intent.action.MAIN" /> 
   
 
   
 
            <category android:name="android.intent.category.LAUNCHER" /> 
   
 
   
 
        </intent-filter> 
   
 
   
 
    }}} 
   
 
   
 
    如果没有这个配置,应用安装后不会显示在launcher中,无法启动。 
   
 
  
 
     
  
 
  
 
   = 短信发送器 = 
  
 
  
 
   很简单, 直接贴核心代码: 
  
 
  
 
   {{{class="brush:java" 
  
 
  
 
       String number = et_number.getText().toString().trim(); 
  
 
  
 
       String content = et_content.getText().toString().trim(); 
  
 
  
 
       if(TextUtils.isEmpty(number) || TextUtils.isEmpty(content)) { 
  
 
  
 
           Toast.makeText(this, "号码或短信内容不能为空", Toast.LENGTH_SHORT).show(); 
  
 
  
 
       } else { 
  
 
  
 
           // 发短信需要使用 SmsManager, 注意要使用 android.telephony.SmsManager 
  
 
  
 
           SmsManager smsManager = SmsManager.getDefault(); 
  
 
  
 
           // 将长文本切割成多条短信. 
  
 
  
 
           ArrayList<String> messages = smsManager.divideMessage(content); 
  
 
  
 
           for(String msg : messages) { 
  
 
  
 
               smsManager.sendTextMessage(number, null, msg, null, null); 
  
 
  
 
           } 
  
 
  
 
           Toast.makeText(this, "短信发送成功", Toast.LENGTH_SHORT).show(); 
  
 
  
 
       } 
  
 
  
 
   }}} 
  
 
  
 
   别忘了加权限: 
  
 
  
 
   {{{class="brush:java" 
  
 
  
 
   <uses-permission android:name="android.permission.SEND_SMS"/> 
  
 
  
 
   }}}