目录

  • 前言
  • 一、安卓基础知识简介
  • 二、步骤
  • 1.创建Activity
  • 2.编辑视图xml文件
  • 3.编写事件响应函数
  • 4.编写通信函数
  • 5.ListView控件
  • 6.编写服务器端程序
  • 总结



前言

最近有点空闲时间,我有一点java web开发基础,于是尝试学习了一下安卓,用一些最基础的功能写了一个app,在这里总结一下开发的流程。


一、安卓基础知识简介

安卓有四大组件、五大存储、六大布局,我这是初次学习安卓开发,所以并没有用到这些。
开发一个最基础的app,组件只需要用Activity,不需要存储,布局用Linearlayout和Relativelayout就可以了。

二、步骤

1.创建Activity

两种方式:
直接右击新建Activity
或者自己编写类继承AppCompatActivity,重写onCreate等方法,然后layout文件夹下创建xml文件,在xml文件中注册对应的Activity类,然后将这个Activity注册到AndroidManifest.xml文件中
onCreate函数里编写的是首次创建这个Activity时发生的事件,仅调用一次,以后再回到此Activity也不会再调用。
onResume函数里写的是来到这个Activity时发生的事件,每次这个Activity出现时都会调用一次。
onDestroy函数里写的是Activity销毁之前发生的事件,如果是直接杀后台的方式结束程序,不能保证onDestroy被调用:如果是子线程被杀,主线程会调用onDestroy,如果是主线程被杀,则不会调用onDestroy(比如在程序启动后来到的第二个页面被杀了后台,第一个页面的onDestroy会被调用,但在第一个页面杀后台,则第一个页面的onDestroy不会被调用)
而且即使被杀后台时调用了onDestroy,也仅能执行简单的程序,我用Log打印日志信息成功了,但试图向服务器发送一个http请求却失败了。

通过AppCompatActivity类提供的findViewById方法,可以获取到对应id的控件,然后通过set和get方法等,可以获取到这些控件的信息

Activity的跳转

//若在主线程中
startActivity(new Intent(this, MessagePage.class));
//若在子线程中
startActivity(new Intent(MainActivity.this, MessagePage.class));

Activity的退出

//调用Activity的finish函数结束
this.finish();

2.编辑视图xml文件

这部分和css差别不大。


3.编写事件响应函数

给按钮等控件创建点击事件函数的方法有好几种,我这里就随便写两种:

第一种,在activity里重写onClick方法,然后根据控件的id选择处理函数,这种不需要给控件写onCllick属性,只需要写控件id

@Override
    public void onClick(View view){
        switch (view.getId()){
            case R.id.sendMessageButton:
                sendMessageToServer(view);
                break;
        }
    }
    public void sendMessageToServer(View view){}

第二种:在控件里添加onClick属性,然后activity里编写对应的函数

<Button
        android:id="@+id/loginButton"
        android:text="登录"
        android:onClick="indexLogin"
        />
public void indexLogin(View view) {}

4.编写通信函数

http同步请求:
如果是post方法,需要RequestBody

//创建json对象作为要post的内容
	final JSONObject loginjo = new JSONObject();
        loginjo.put("name", account);
        loginjo.put("content", password);
	new Thread(){
            @Override
            public void run(){
                //创建RequestBody
                RequestBody body = RequestBody.create(loginjo.toString().getBytes());
                //采用Builder才能设置超时时间
                OkHttpClient okHttpClient = new OkHttpClient.Builder()
                        .connectTimeout(2000, TimeUnit.MILLISECONDS)
                        .build();
                //创建Request
                Request req = new Request.Builder()
                        .url("http://"+StaticData.serverIP+"/indexLogin")
                        .post(body)
                        .build();
                //创建Call
                Call call = okHttpClient.newCall(req);
                //用try catch环绕
                try{
                	//发送http请求
                    Response resp = call.execute();
                    //获取http响应
                    String respstr = resp.body().string();    
                }
                catch(IOException e){
                    e.printStackTrace();
                }
            }
        }.start();

5.ListView控件

从服务器获取的数据经常是List类型的,这时候就需要将他们动态的填充在ListView控件里

<ListView
        android:id="@+id/friendList"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>

ListView填充数据

ListView listView = findViewById(R.id.friendList);
//设置适配器
listView.setAdapter(new FriendListAdapter(StaticData.friendList, this));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    	TextView textView = view.findViewById(R.id.singleFriendTextView);
    	StaticData.currentFriendAccount = textView.getText().toString();
    	startActivity(new Intent(FriendPage.this, ChatPage.class));
    }
});

适配器类

public class FriendListAdapter extends BaseAdapter {
    private List<String> list;
    private Context context;
    public FriendListAdapter(String[] flist, Context context){
        list = new ArrayList<String>();
        if(flist != null){
            for(int i = 0; i < flist.length; i++){
                list.add(flist[i]);
            }
        }
        this.context = context;
    }
    @Override
    public int getCount() {
        return list.size();
    }
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null){
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.single_friend, parent, false);
            viewHolder.textView = convertView.findViewById(R.id.singleFriendTextView);
            convertView.setTag(viewHolder);
        }
        else{
            viewHolder = (ViewHolder)convertView.getTag();
        }
        viewHolder.textView.setText((String)getItem(position));
        return convertView;
    }
    private class ViewHolder{
        TextView textView;
    }
}

6.编写服务器端程序

根据安卓客户端采用的通信协议而定,如果客户端采用http协议,则服务器端可以直接用tomcat等服务器处理,不需要自行编写socket程序去解析http request了,就像BS架构的网站应用程序,只是发起请求的对象从浏览器变成了APP,请求的数据从html、css、js等文件变成了具体数据,所以也不需要编写网站前端了。



总结

有了响应函数、列表控件、通信程序这些,就可以完成一个简单的安卓应用了,但是对于复杂的应用来说还远远不够。