zoukankan      html  css  js  c++  java
  • 东拼西凑的第一个Android应用程序

    听说下一个互联网时代是终端时代,而且最近微博、IPhone、Android都特火。于是就开始捣鼓起Android来,虽然去年三月份的时候就花了三千四百大洋买Milestone。但是一直忙于学习与考试没有功夫来学习学习Android方面的开发。新年元旦利用两天假期+万能的Google搜出来的代码搞了第一个Android应用程序,虽然是第一个,但不是“Hello World”级别的,至少还是多线程的:)

    庐山真面目:MyWhois

    image

    这就是我的第一个Android应用:MyWhois,通过在输入框输入域名后查询该域名的所有者信息。当然域名Whois信息的查询接口我已经在我的网站上开发好了,MyWhois只不过是通过http get方式调用一下而以。好了下面就简单介绍一下如何开发这个应用吧。

    Android开发环境的搭建

    我的环境是Windwos 7 64bit+Eclipse Helios Service Release 1+JDK 6 64bit,那么首先上Android Developer 官网下载最新的installer_r08-windows.exe,下载完之后通过提示安装相应的SDK及工具包,这一步安装还是比较顺利只不过下载的时间较长而以。安装好SDk之后,还需要从官网下载Eclipse的Android开发工具插件ADT并通过Eclipse菜单中的Help->Install New Software…进行安装,安装好之后在菜单Windows->Preferences->Android->Android Perferences的SDK Location中指向Android SDK的安装目录(如下图)。之前我在安装过程中到这一步之后就一直提示我目录错误,SDK列表刷不出来。其实主要是因为adb.exe与Android 1.5的位置不同,还有我之前安装的ADT版本好像只支持Android 1.5版的。通过升级了ADT就解决了该问题。

    image

    OK,以上就是Android开发的环境搭建的几个基本步骤。详细的步骤请参考SDK里的Installing the SDK。

     

    MyWhois开发

    1.项目目录结构

    下面就是具体的应用开发了,在下面的内容开始之前,先允许你开个小差在Eclipse上捣鼓个“Hello World”的Android程序先过一过瘾。那么我们就认为你已经有了一点点的经验。在开发应用程序之前我们首先需要创建一个Android应用程序。创建好之后我们来看看我们项目的目录结构(如下图)。简单介绍一下:res/layout/main.xml是程序的界面代码部分,src/CBCYE.MyWhois/MyWhois.java是程序的代码部分。

    image

    2. 程序界面部分开发

    习惯了.NET拖拽的方式来开发程序界面而且鉴于IDE严重比不上Visual Studio所以可以使用第三方的DroidDraw来开发应用程序的界面。之后再把代码拷贝到main.xml中。本程序中使用到的控件有:EditText、TextView、Button。具体的界面自己画吧,效果图如下:

    image

    需要注意的是由于有些Whois信息比较多一屏可能显示不了,那么就需要滚动条。Android里面需要使用ScrollView与TextView结合来实现滚动条功能。具体代码如下:

     1     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     2             android:layout_width="306px" android:layout_height="410px" 
     3             android:layout_x="7px" android:layout_y="61px"
     4             android:scrollbars="vertical" android:fadingEdge="vertical"> 
     5     <TextView
     6     android:id="@+id/ResultView"
     7     android:layout_width="fill_parent"
     8     android:layout_height="fill_parent"
     9     android:layout_marginTop="2px"
    10     android:layout_marginBottom="2px"
    11     android:layout_marginLeft="2px"
    12     android:layout_marginRight="2px"
    13     android:text="请在输入框中输入域名"
    14     android:layout_x="7px"
    15     android:layout_y="61px"
    16     >
    17     </TextView>
    18     </ScrollView>
    19 

    3.程序代码部分开发

    本部分基本上靠Google来完成。我自己加了些注释,大家应该看得懂,思路是:通过监听Button的OnClick事件之后获得EditText的值。创建一个新的线程(否则主界面会假死)向事先定义好的接口地址请求Whois信息并通过Handler来将返回的消息界面到TextView控件。

    MyWhois_SourceCode
    package CBCYE.MyWhois;

    import android.app.Activity;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.os.Bundle;  
    import android.widget.TextView;
    import android.widget.EditText;
    import android.widget.Button; 

    import android.os.Message; 
    import android.os.Handler; 
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    import org.apache.http.util.ByteArrayBuffer;
    import org.apache.http.util.EncodingUtils;

    public class MyWhois extends Activity {
        
    private TextView vResult;
        
    private EditText eKeyWord;
        
    /** Called when the activity is first created. */
        @Override
        
    public void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            Button sButton1 
    = (Button)findViewById(R.id.Submit); 
            vResult 
    = (TextView)findViewById(R.id.ResultView);
            eKeyWord 
    = (EditText)findViewById(R.id.KeyWord); 
            
            
    //注册点击事件监听者  
            sButton1.setOnClickListener(new OnClickListener()
            {
                
    public void onClick(View aView) { 
                    TextView vResult 
    = (TextView)findViewById(R.id.ResultView);
                    vResult.setText(
    "正在查询中,请稍等!");
                    
                    
    //新建查询线程,否则UI界面会假死
                    Thread mThread = new Thread(new Runnable() {
                        
    public void run() {                        
                              
    try {
                                  
    //返回的数据需要使用'\n'来换行!
                                  URL url = new URL("http://www.cbcye.cn/whois.axd?w="+eKeyWord.getText().toString());
                                  
                                   URLConnection urlConnection 
    = url.openConnection();
                                   InputStream is 
    = urlConnection.getInputStream();
                                   
                                   
    /* 用ByteArrayBuffer做缓存 */
                                            ByteArrayBuffer baf 
    = new ByteArrayBuffer(50);
                                            
    int current = 0;
                                            
                                            
    while((current = is.read()) != -1){
                                                 baf.append((
    byte)current);
                                            }
                                            
                                            
    /* 将缓存的内容转化为String, 用UTF-8编码 */
                                            String myString 
    = EncodingUtils.getString(baf.toByteArray(), "UTF-8");
                                           
    //myString = new String(baf.toByteArray());
                                            
    //vResult.setText(myString);
                                            Message mg = Message.obtain();  
                                            mg.obj 
    = myString;  
                                            mHandler.sendMessage(mg);  
                                            
                                  } 
    catch (Exception e) {
                                   e.printStackTrace();
                                  }
                        }
                        
                    });
                     mThread.start();  
                }
            }
            
            ); 
        }
        
        
    //定义一个Handler  
        private Handler mHandler = new Handler(){  
            
    public void handleMessage(Message msg){  
                String m 
    = (String) msg.obj;
                
    if(m.length()<=0)
                {
                    vResult.setText(
    "查询结果为空.");
                }
                
    else
                {
                    vResult.setText(m);
                }
            }  
        };  
    }

    由于程序需要使用网络连接所以需要事先声明程序的权限,这一点还是挺好的,毕竟移动流量比有线的贵很多。设置的地方是在MyWhois.Manifest中添加相应的权限定义语句,具体如下:

    MyWhois_Permission
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package
    ="CBCYE.MyWhois"
          android:versionCode
    ="1"
          android:versionName
    ="1.0">
        
    <uses-permission android:name="android.permission.INTERNET" /> 
        
    <application android:icon="@drawable/icon" android:label="@string/app_name">
            
    <activity android:name=".MyWhois"
                      android:label
    ="@string/app_name">
                
    <intent-filter>
                    
    <action android:name="android.intent.action.MAIN" />
                    
    <category android:name="android.intent.category.LAUNCHER" />
                
    </intent-filter>
            
    </activity>

        
    </application>

    </manifest> 


    调试与部署

    Android应用程序的调试可以使用SDK自带的虚拟机来实现也可以通过USB接口连接真实的手机来实现(需要在手机中开启USB调试)。如果需要使用虚拟机来实现的话在Eclipse菜单Windows->Android SDK and Manager的Virtual devices中新建虚拟机。

    image
    那么在调试的时候就会让你选择是使用哪台虚拟机或者是使用USB相连的手机来进行调试,如果选择自动模式的话可能系统会自动启动一台虚拟机来进行调试。

    image

    最后,我们就可以在虚拟机里看到我们开发的程序了。

    image

    当然,我们实际开发过程中可能这些信息还不够,那么我们就可以点击Eclipse中的Debug Tab在Log Cat中查看更详细调试信息。USB连接手机的调试与虚拟机类似。

    总结

    初步试了一下Android,虽然代码都是从网上东拼西凑的而且对Java也不是太了解。但是觉得蛮有意思、蛮有成就感的,特别是自己开发的程序能在自己的手机上运行时。我觉得程序开发这一些应该问题不大。另外要是界面开发这一块再有点大改进或者有更好的IDE来支持开发的话那就太完美了。未来的互联网就是终端的天下,信息基于终端开发的应用会越来越多,开发起来也会越来越简单。

    源码下载 

    参考资料

    Android之旅--Handler与多线程

    Android线程交互(Handler+Thread 和 AsyncTask)

  • 相关阅读:
    [NHibernate]条件查询Criteria Query
    [JQuery]用InsertAfter实现图片走马灯展示效果
    [NHibernate]HQL查询
    [NHibernate]基本配置与测试
    [HTML/CSS]margin属性用法
    [HTML/CSS]盒子模型,块级元素和行内元素
    [Asp.net MVC]Asp.net MVC5系列——布局视图
    [c#基础]值类型和引用类型的Equals,==的区别
    用中间件实现读负载均衡的数据库群集
    论数据库连接池对中间件性能的重要性
  • 原文地址:https://www.cnblogs.com/cbcye/p/1929283.html
Copyright © 2011-2022 走看看