目录
- 前言
- 一、安卓基础知识简介
- 二、步骤
- 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等文件变成了具体数据,所以也不需要编写网站前端了。
总结
有了响应函数、列表控件、通信程序这些,就可以完成一个简单的安卓应用了,但是对于复杂的应用来说还远远不够。