Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
°²×¿µÚÆßÌì±Ê¼Ç--ÍøÂç±à³Ì
 
×÷ÕߣºÉ­ÁÖÉ­ À´×ÔÓÚ£º²©¿ÍÔ° ·¢²¼ÓÚ 2016-3-22
  3137  次浏览      27
 

Android¶ÔÍøÂçµÄÖ§³Ö

AndroidÍêȫ֧³ÖJDK±¾ÉíµÄTCP,UDPÍøÂçͨÐÅAPI,Ò²¿ÉÒÔʹÓÃServerSocket,SocketÀ´½¨Á¢»ùÓÚTCP/IPЭÒéµÄÍøÂçͨÐÅ,»¹¿ÉÒÔʹÓÃDatagramSocket,Datagrampacket,MulticastSocketÀ´½¨Á¢ »ùÓÚUDPµÄЭÒéÍøÂçͨÐÅ.

ͬʱ֧³ÖJDKÌṩµÄURL,URLConnectionµÈÍøÂçͨÐÅAPI.

AndoirdgipÄÚÖÃÁËApacheµÄHttpClient,ÕâÑù¿ÉÒԷdz£·½±ãµÄ·¢ËÍHTTPÇëÇó,²¢»ñÈ¡HTTPÏìÓ¦.

1.SocketʵÏÖ

·þÎñÆ÷

package com.itheima.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
* ServerSocket ·þÎñ¶Ë
* @Decription TODO
public class MyServer {

public static ArrayList<Socket> socketList = new ArrayList<Socket>();
public static void main(String[] args) {
try {
//½¨Á¢serversocket

ServerSocket serverSocket = new ServerSocket(25000);
//·þÎñÆ÷Ò»Ö±ÔÚÔËÐÐ״̬
while(true){
//¿ªÊ¼¼àÌý
Socket socket = serverSocket.accept();
socketList.add(socket);
//Æô¶¯ÐµÄÏß³Ì
new ServerThread(socket).start();
}

} catch (IOException e) {
e.printStackTrace();
}
}

}
/*
Ïß³ÌÀà
*/

package com.itheima.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class ServerThread extends Thread {
private Socket socket;

public ServerThread(Socket socket) throws IOException {
//³õʼ»¯
this.socket = socket;
}

@Override
public void run() {
String ip = socket.getInetAddress().getHostAddress();
System.out.println("ip:"+ip);
BufferedReader br=null;
OutputStream out = null;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream(),
"UTF-8"));
out = socket.getOutputStream();

String content = null;
while((content=br.readLine())!=null){
System.out.println("À´×Ô¿Í»§¶Ë:"+content);
//ÊÖ¶¯¼ÓÉÏ»»ÐÐ ·û,²»È»Ã»¿Í»§¶ËÊÕ²»µ½
out.write((content+"\n").toUpperCase().getBytes("utf-8"));

System.out.println("·þÎñ·¢³öÈ¥ÁË:");
}
out.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}

}
}

²¼¾ÖÎļþ

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.itheima.mutithreadclient.MainActivity">

<!--½ÓÊÕÓû§ÊäÈëµÄÄÚÈÝ-->
<EditText
android:id="@+id/input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="ÇëÊäÈëÒª·¢Ë͵ÄÄÚÈÝ"/>
<Button
android:id="@+id/send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="·¢ËÍ"/>

<!--½ÓÊÕ·þÎñ·µ»ØµÄÄÚÈÝ-->
<TextView
android:id="@+id/show"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

×ÓÏß³Ì

/**
* Ïß³ÌÀà
public class ClientThread implements Runnable{
private static final String TAG = "ClientThread";

private Socket s;
// ¶¨ÒåÏòUIÏ̷߳¢ËÍÏûÏ¢µÄHandler¶ÔÏó
private Handler handler;
// ¶¨Òå½ÓÊÕUIÏ̵߳ÄÏûÏ¢µÄHandler¶ÔÏó
public Handler revHandler;
// ¸ÃÏß³ÌËù´¦ÀíµÄSocketËù¶ÔÓ¦µÄÊäÈëÁ÷
BufferedReader br = null;
OutputStream os = null;
public ClientThread(Handler handler)
{
this.handler = handler;
}
public void run()
{
try
{
s = new Socket("192.168.1.103", 25000);
br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
os = s.getOutputStream();
// Æô¶¯Ò»Ìõ×ÓÏß³ÌÀ´¶ÁÈ¡·þÎñÆ÷ÏìÓ¦µÄÊý¾Ý
new Thread()
{
@Override
public void run()
{
String content = null;
// ²»¶Ï¶ÁÈ¡SocketÊäÈëÁ÷ÖеÄÄÚÈÝ
try
{
while ((content = br.readLine()) != null)
{
// ÿµ±¶Áµ½À´×Ô·þÎñÆ÷µÄÊý¾ÝÖ®ºó£¬·¢ËÍÏûϢ֪ͨ³ÌÐò
// ½çÃæÏÔʾ¸ÃÊý¾Ý
Message msg = new Message();
msg.what = 0x123;
msg.obj = content;
handler.sendMessage(msg);
Log.i(TAG,"·þÎñ·µ»Ø"+content);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}.start();
// Ϊµ±Ç°Ï̳߳õʼ»¯Looper
Looper.prepare();
// ´´½¨revHandler¶ÔÏó
revHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// ½ÓÊÕµ½UIÏß³ÌÖÐÓû§ÊäÈëµÄÊý¾Ý
if (msg.what == 0x345)
{
// ½«Óû§ÔÚÎı¾¿òÄÚÊäÈëµÄÄÚÈÝдÈëÍøÂç
try
{
//ÊÖ¶¯¼ÓÉÏ»»Ðзû
os.write((msg.obj.toString() + "\r\n")
.getBytes("utf-8"));
Log.i(TAG, "ÊäÈëµÄ" + msg.obj.toString());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
};
// Æô¶¯Looper
Looper.loop();
}
catch (SocketTimeoutException e1)
{
System.out.println("ÍøÂçÁ¬½Ó³¬Ê±£¡£¡");
}
catch (Exception e)
{
e.printStackTrace();
}
}

}

Activity

/**
*
* ʹÓÃServketSocket×ö·þÎñͨÐÅ
public class MainActivity extends AppCompatActivity {

private EditText input;

private TextView show;

private ClientThread clientThread;

private Button send;

private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

input = (EditText) findViewById(R.id.input);

show = (TextView) findViewById(R.id.show);

send = (Button) findViewById(R.id.send);

/**
* ½ÓÊÕµ½ÏûÏ¢Òª¾ÍÏÔʾ
*/
handler = new Handler(){
@Override
public void handleMessage(Message msg) {

if(msg.what==0x123){
show.append("\n"+msg.obj.toString());
}

}
};
//³õʼ»¯×ÓÏß³Ì
clientThread = new ClientThread(handler);
//Æô¶¯×ÓÏß³Ì
new Thread(clientThread).start();

send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = input.getText().toString().trim();

Message msg=new Message();
msg.what=0x345;
msg.obj=str;

//°ÑÄÚÈÝ·¢¸ø×ÓÏß³Ì
clientThread.revHandler.sendMessage(msg);

//Çå¿ÕÎı¾¿ò
input.setText("");
}
});
}
}


<!--Ìí¼ÓÍøÂçȨÏÞ-->
<uses-permission android:name="android.permission.INTERNET"/>

2.URLÁ¬½ÓÍøÂç

²¼¾Ö

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<EditText
android:id="@+id/et_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="ÇëÊäÈëURLͼƬµØÖ·"/>

<Button
android:onClick="display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ÏÔʾͼƬµØÖ·"/>
<ImageView
android:id="@+id/show"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

Activity

/**
* URLÁ¬½ÓÍøÂç
* »ñÈ¡URLµØÖ·
* ´ò¿ªÁ÷,»ñÈ¡Á÷µÄÄÚÈÝ
public class MainActivity extends AppCompatActivity {

/*
±êʶ±íʾ³É¹¦
*/
private static final int SUCCESS = 1;
//·¾¶Ð´ËÀÁË Ò²¿ÉÒÔ»ñÈ¡µÄ·½Ê½
private String path ="http://img2.imgtn.bdimg.com/it/u=4114593003,3380074209&fm=21&gp=0.jpg";
/*
ͼƬ
*/
Bitmap bitmap;

/*
ÏÔʾͼƬ
*/
ImageView show;

/*
ÊäÈëµÄURL
*/
private EditText et_url;

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

et_url = (EditText) findViewById(R.id.et_url);

show = (ImageView) findViewById(R.id.show);


handler = new Handler(){

@Override
public void handleMessage(Message msg) {

switch(msg.what){
case SUCCESS:
show.setImageBitmap(bitmap);
break;
}
}
};
}
/**
* »ñÈ¡ÊäÈëµÄµØÖ·²¢ÏÔʾͼƬ
* @param v µ±Ç°¶ÔÏó
*/
public void display(View v){
String strPath = et_url.getText().toString().trim();

if(TextUtils.isEmpty(strPath)){

Toast.makeText(this,"ÊäÈëµÄ·¾¶²»ÄÜΪ¿Õ",Toast.LENGTH_SHORT).show();
return ;
}

new Thread(new Runnable() {
@Override
public void run() {
try {

//»ñÈ¡URL
URL url = new URL(path);
//´ò¿ªÁ÷»ñÈ¡×ÊÔ´
InputStream in = url.openStream();

//ʹÓÃBitmapFactoryת»»ÎªBitmap
bitmap = BitmapFactory.decodeStream(in);
//»ñÈ¡ÏûÏ¢
Message msg = Message.obtain();
msg.what=SUCCESS;
msg.obj=bitmap;

handler.sendMessage(msg);
//¹Ø±Õ
// in.close();
//°ÑÎļþ±£´æµ½±¾µØ
in =url.openStream();

OutputStream out = openFileOutput("test.png",MODE_PRIVATE);

byte [] buf = new byte [1024];
int len=0;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
out.close();
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}).start();

}}

Ìí¼ÓÍøÂçȨÏÞ

<!--Ìí¼ÓÍøÂçȨÏÞ-->
<uses-permission android:name="android.permission.INTERNET"/>

3.URLConnectionÁ¬½ÓÍøÂç

ʹÓÃURLConnectionÁ¬½ÓÍøÂç

Get·½Ê½Ö»Òª »ñÈ¡ÇëÇóµØÖ·°ÑÇëÇó²ÎÊýÆ´½ÓÔÚURLµØÖ·ºóÃæ"?username="+user+"&password="+password

openConnection

ÉèÖÃÇëÇóÍ·ÐÅÏ¢

connect()½¨Á¢Êµ¼ÊÁ¬½Ó

»ñÈ¡ÊäÈëÁ÷conn.getInputStream

¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ

Post·½Ê½,

ÇëÇóµØÖ·

½«²ÎÊýµ¥¶ÀÆ´½ÓΪһ¸ö×Ö·û´®params="username="+user+"&password="+password

openConnection

ÉèÖÃÇëÇóÍ·ÐÅÏ¢

connect()½¨Á¢Êµ¼ÊÁ¬½Ó

setDoOuput(true)

setDoInput(true)

д³ö²ÎÊýconn.getOutPutStream().write(params.getBytes());

»ñÈ¡ÊäÈëÁ÷conn.getInputStream

¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ

·þÎñÆ÷Servlet

/**
* LoginServlet
* @Decription ´¦ÀíµÇ¼ÇëÇóµÄServlet
@WebServlet(urlPatterns={"/login"})
public class LoginServlet extends HttpServlet {

@SuppressWarnings("deprecation")
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
* »ñÈ¡Óû§ÃûÓëÃÜÂ벢ת»»ÎªUTF-8
String user = request.getParameter("username");
/*String encode = URLEncoder.encode(user,"iso8859-1");
String decode = URLDecoder.decode(encode, "UTF-8");*/

String username =new String(user.getBytes("iso8859-1"),"utf-8");
System.out.println("Óû§Ãû:"+username);

String pwd=request.getParameter("password");

String password = new String(pwd.getBytes("iso8859-1"), "UTF-8");
System.out.println("ÃÜÂë:"+password);

/*
* ÕâÀïдËÀÓû§ÃûÓëÃÜÂë,
* Õý³£ÊÇÈ¥Êý¾Ý¿â²éѯ
*/
PrintWriter writer = response.getWriter();

if("admin".equals(username)&& "admin".equals(password)){
writer.write("SUCCESS");

}else{
writer.write("FAILURE");
}
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("================post===============");
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");

String password = request.getParameter("password");
System.out.println("username:"+username+",password: "+password);

if("admin".equals(username) && "admin".equals(password)){
response.getWriter().print("SUCCESS");
}else{
response.getWriter().print("failure");
}
}

}

3.1getÇëÇóÓëPostÇëÇó

²¼¾Ö

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.itheima.urlconnection.MainActivity">

<EditText
android:id="@+id/et_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="ÇëÊäÈëÓû§Ãû"/>
<EditText
android:id="@+id/et_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="ÇëÊäÈëÃÜÂë"/>
<Button
android:onClick="get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="GETÇëÇó"/>
<Button
android:onClick="post"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="POST ÇëÇó"/>
<TextView
android:id="@+id/show"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

Activity

/**
* ʹÓÃURLConnectionÁ¬½ÓÍøÂç
*Get·½Ê½Ö»Òª »ñÈ¡ÇëÇóµØÖ·°ÑÇëÇó²ÎÊýÆ´½ÓÔÚURLµØÖ·ºóÃæ"?username="+user+"&password="+password
* openConnection
* ÉèÖÃÇëÇóÍ·ÐÅÏ¢
* connect()½¨Á¢Êµ¼ÊÁ¬½Ó
* »ñÈ¡ÊäÈëÁ÷conn.getInputStream
* ¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ
* Post·½Ê½,
* ÇëÇóµØÖ·
* ,½«²ÎÊýµ¥¶ÀÆ´½ÓΪһ¸ö×Ö·û´®params="username="+user+"&password="+password
* openConnection
* ÉèÖÃÇëÇóÍ·ÐÅÏ¢
* connect()½¨Á¢Êµ¼ÊÁ¬½Ó
* setDoOuput(true)
* setDoInput(true)
* д³ö²ÎÊýconn.getOutPutStream().write(params.getBytes());
* »ñÈ¡ÊäÈëÁ÷conn.getInputStream
* ¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ
public class MainActivity extends AppCompatActivity {

private static final int SUCCESS = 1;
private static final int ERROR =2 ;
private static final String TAG ="MainActivity" ;
/*
ÇëÇóµÄ·¾¶
*/
private String path="http://192.168.1.103:8080/Login/login";

private TextView show;

private EditText et_user;

private EditText et_pwd;
/*
Handler ÏûÏ¢´¦Àí
*/

private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/*
³õʼ»¯
*/
et_user = (EditText) findViewById(R.id.et_user);
et_pwd = (EditText) findViewById(R.id.et_pwd);

show = (TextView) findViewById(R.id.show);

handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case SUCCESS:
show.setText(msg.obj.toString());
break;
case ERROR:
Toast.makeText(MainActivity.this,"ÍøÂçÒì³£",Toast.LENGTH_SHORT).show();
break;
}
}
};
}
/**
* get ·½Ê½ÇëÇó
* @param v µ±Ç°×é¼þ
*/
public void get(View v){

String username = et_user.getText().toString().trim();

String password = et_pwd.getText().toString().trim();

if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){

Toast.makeText(this,"Óû§Ãû»òÕßÃÜÂë²»ÄÜΪ¿Õ",Toast.LENGTH_SHORT).show();
return ;
}

final String urlName =path+"?username="+username+"&password="+password;
/*
getÇëÇó
*/
new Thread(){
@Override
public void run() {
try {
//»ñÈ¡ÇëÇóURLµØÖ·
URL url=new URL(urlName);
//´ò¿ªÁ¬½Ó
URLConnection conn = url.openConnection();

//ÉèÖó¬Ê±Ê±¼ä
conn.setConnectTimeout(5000);

// ÉèÖÃͨÓõÄÇëÇóÊôÐÔ
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//½¨Á¢Êµ¼ÊÁ¬½Ó
conn.connect();
//»ñÈ¡ËùÓеÄÐÐÏìÓ¦ Í·×Ö¶Î

Map<String,List<String>> map = conn.getHeaderFields();
Set<String> keySet = map.keySet();
for (String key:keySet ) {
Log.i(TAG,"key"+key+"------------>"+map.get(key));
}

//¶¨ÒåÊäÈëÁ÷À´»ñÈ¡URLµÄÏìÓ¦

InputStream in = conn.getInputStream();
ByteArrayOutputStream bas= new ByteArrayOutputStream();

int len=0;

byte [] buf = new byte[1024];

while((len=in.read(buf))!=-1){
bas.write(buf,0,len);
}

//ת»»Îª×Ö·û´®
String result=bas.toString();

//ÉèÖÃÏûÏ¢¶ÔÏó
Message msg = Message.obtain();
//³É¹¦¾Í·¢ËÍSUCCESS
msg.what=SUCCESS;
msg.obj=result;
//·¢ËÍ
handler.sendMessage(msg);

} catch (Exception e) {
e.printStackTrace();
//³öÒì³£¾Í·¢ËÍERROR
Message msg = Message.obtain();

msg.what=ERROR;
handler.sendMessage(msg);
}


}
}.start();

}

/**
* post ·½Ê½ÇëÇó
* @param v µ±Ç°×é¼þ
*/
public void post(View v){
String username = et_user.getText().toString().trim();

String password = et_pwd.getText().toString().trim();

if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){

Toast.makeText(this,"Óû§Ãû»òÕßÃÜÂë²»ÄÜΪ¿Õ",Toast.LENGTH_SHORT).show();
return ;
}
final String params="username="+username+"&password="+password;
/*
postÇëÇó
*/
new Thread(){
@Override
public void run() {
try {
//»ñÈ¡ÇëÇóURLµØÖ·
URL url=new URL(path);
//´ò¿ªÁ¬½Ó
URLConnection conn = url.openConnection();

//ÉèÖó¬Ê±Ê±¼ä
conn.setConnectTimeout(5000);

// ÉèÖÃͨÓõÄÇëÇóÊôÐÔ
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
postÇëÇó±ØÐëÓÐÒÔÏÂ2ÐÐ
conn.setDoOutput(true);
conn.setDoInput(true);

OutputStream out = conn.getOutputStream();

out.write(params.getBytes());

//½¨Á¢Êµ¼ÊÁ¬½Ó

//»ñÈ¡ËùÓеÄÐÐÏìÓ¦ Í·×Ö¶Î

Map<String,List<String>> map = conn.getHeaderFields();
Set<String> keySet = map.keySet();
for (String key:keySet ) {
Log.i(TAG,"key"+key+"------------>"+map.get(key));
}

//¶¨ÒåÊäÈëÁ÷À´»ñÈ¡URLµÄÏìÓ¦

InputStream in = conn.getInputStream();
ByteArrayOutputStream bas= new ByteArrayOutputStream();

int len=0;

byte [] buf = new byte[1024];

while((len=in.read(buf))!=-1){
bas.write(buf,0,len);
}

//ת»»Îª×Ö·û´®
String result=bas.toString();

//ÉèÖÃÏûÏ¢¶ÔÏó
Message msg = Message.obtain();
//³É¹¦¾Í·¢ËÍSUCCESS
msg.what=SUCCESS;
msg.obj=result;
//·¢ËÍ
handler.sendMessage(msg);

} catch (Exception e) {
e.printStackTrace();
//³öÒì³£¾Í·¢ËÍERROR
Message msg = Message.obtain();

msg.what=ERROR;
handler.sendMessage(msg);
}
}
}.start();

}
}

Ìí¼ÓÍøÂçȨÏÞ

<!--Ìí¼ÓÍøÂçȨÏÞ-->
<uses-permission android:name="android.permission.INTERNET"/>

4.HttpÍøÂçÁ¬½Ó

ºÍURLConnection·Ç³£ÀàËÆÖ»»ñÈ¡Á¬½ÓΪHttpURULConnection

* ʹÓÃHttpURLConnectionÁ¬½ÓÍøÂç
*Get·½Ê½Ö»Òª »ñÈ¡ÇëÇóµØÖ·°ÑÇëÇó²ÎÊýÆ´½ÓÔÚURLµØÖ·ºóÃæ"?username="+user+"&password="+password
* openConnection
* ÉèÖÃÇëÇó·½·¨setRequestMethod("GET")±ØÐë´óд
*
* »ñÈ¡ÊäÈëÁ÷conn.getInputStream
* ¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ
*
* Post·½Ê½,
* ÇëÇóµØÖ·
* ,½«²ÎÊýµ¥¶ÀÆ´½ÓΪһ¸ö×Ö·û´®params="username="+user+"&password="+password
* openConnection
* ÉèÖÃÇëÇó·½·¨setRequestMethod("POST")±ØÐë´óд
* setDoOuput(true)
* setDoInput(true)
* д³ö²ÎÊýconn.getOutPutStream().write(params.getBytes());
* »ñÈ¡ÊäÈëÁ÷conn.getInputStream
* ¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ


/**
* ʹÓÃHttpURLConnectionÁ¬½ÓÍøÂç
*Get·½Ê½Ö»Òª »ñÈ¡ÇëÇóµØÖ·°ÑÇëÇó²ÎÊýÆ´½ÓÔÚURLµØÖ·ºóÃæ"?username="+user+"&password="+password
* openConnection
* ÉèÖÃÇëÇó·½·¨setRequestMethod("GET")±ØÐë´óд
*
* »ñÈ¡ÊäÈëÁ÷conn.getInputStream
* ¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ
* Post·½Ê½,
* ÇëÇóµØÖ·
* ,½«²ÎÊýµ¥¶ÀÆ´½ÓΪһ¸ö×Ö·û´®params="username="+user+"&password="+password
* openConnection
* ÉèÖÃÇëÇó·½·¨setRequestMethod("POST")±ØÐë´óд
* setDoOuput(true)
* setDoInput(true)
* д³ö²ÎÊýconn.getOutPutStream().write(params.getBytes());
* »ñÈ¡ÊäÈëÁ÷conn.getInputStream
* ¶ÁÈ¡ÊäÈëÁ÷ÖеÄÄÚÈÝ
public class MainActivity extends AppCompatActivity{
private static final int SUCCESS = 1;
private static final int ERROR =2 ;
private static final String TAG ="MainActivity" ;
/*
ÇëÇóµÄ·¾¶
*/
private String path="http://192.168.1.100:8080/Login/login";

private TextView show;

private EditText et_user;

private EditText et_pwd;
Handler ÏûÏ¢´¦Àí

private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
³õʼ»¯
et_user = (EditText) findViewById(R.id.et_user);
et_pwd = (EditText) findViewById(R.id.et_pwd);

show = (TextView) findViewById(R.id.show);

handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case SUCCESS:
show.setText(msg.obj.toString());
break;
case ERROR:
Toast.makeText(MainActivity.this, "ÍøÂçÒì³£", Toast.LENGTH_SHORT).show();
break;
}
}
};
}
* get ·½Ê½ÇëÇó
* @param v µ±Ç°×é¼þ
public void get(View v){

String username = et_user.getText().toString().trim();

String password = et_pwd.getText().toString().trim();

if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){

Toast.makeText(this,"Óû§Ãû»òÕßÃÜÂë²»ÄÜΪ¿Õ",Toast.LENGTH_SHORT).show();
return ;
}

final String urlName =path+"?username="+username+"&password="+password;
getÇëÇó
new Thread(){
@Override
public void run() {
try {
//»ñÈ¡ÇëÇóURLµØÖ·
URL url=new URL(urlName);
//´ò¿ªÁ¬½Ó
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

//ÉèÖó¬Ê±Ê±¼ä
conn.setConnectTimeout(5000);
//ÉèÖÃÇëÇó·½Ê½
conn.setRequestMethod("GET");
//»ñÈ¡ÏìÓ¦Âë
int code = conn.getResponseCode();

if(code==200) {
//»ñÈ¡ËùÓеÄÐÐÏìÓ¦ Í·×Ö¶Î

Map<String, List<String>> map = conn.getHeaderFields();
Set<String> keySet = map.keySet();
for (String key : keySet) {
Log.i(TAG, "key" + key + "------------>" + map.get(key));
}

//¶¨ÒåÊäÈëÁ÷À´»ñÈ¡URLµÄÏìÓ¦

InputStream in = conn.getInputStream();
ByteArrayOutputStream bas = new ByteArrayOutputStream();

int len = 0;

byte[] buf = new byte[1024];

while ((len = in.read(buf)) != -1) {
bas.write(buf, 0, len);
}

//ת»»Îª×Ö·û´®
String result = bas.toString();

//ÉèÖÃÏûÏ¢¶ÔÏó
Message msg = Message.obtain();
//³É¹¦¾Í·¢ËÍSUCCESS
msg.what = SUCCESS;
msg.obj = result;
//·¢ËÍ
handler.sendMessage(msg);
}else{
//³öÒì³£¾Í·¢ËÍERROR
Message msg = Message.obtain();

msg.what=ERROR;
handler.sendMessage(msg);
}

} catch (Exception e) {
e.printStackTrace();
//³öÒì³£¾Í·¢ËÍERROR
Message msg = Message.obtain();

msg.what=ERROR;
handler.sendMessage(msg);
}
}
}.start();

}

/**
* post ·½Ê½ÇëÇó
* @param v µ±Ç°×é¼þ
*/
public void post(View v){
String username = et_user.getText().toString().trim();

String password = et_pwd.getText().toString().trim();

if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){

Toast.makeText(this,"Óû§Ãû»òÕßÃÜÂë²»ÄÜΪ¿Õ",Toast.LENGTH_SHORT).show();
return ;
}
final String params="username="+username+"&password="+password;
/*
postÇëÇó
*/
new Thread(){
@Override
public void run() {
try {
//»ñÈ¡ÇëÇóURLµØÖ·
URL url=new URL(path);
//´ò¿ªÁ¬½Ó
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

//ÉèÖó¬Ê±Ê±¼ä
conn.setConnectTimeout(5000);
//ÉèÖÃÇëÇó·½Ê½
conn.setRequestMethod("POST");
/*
postÇëÇó±ØÐëÓÐÒÔÏÂ2ÐÐ
*/
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();

out.write(params.getBytes());

//½¨Á¢Êµ¼ÊÁ¬½Ó

//»ñÈ¡ËùÓеÄÐÐÏìÓ¦ Í·×Ö¶Î

Map<String,List<String>> map = conn.getHeaderFields();
Set<String> keySet = map.keySet();
for (String key:keySet ) {
Log.i(TAG,"key"+key+"------------>"+map.get(key));
}

//¶¨ÒåÊäÈëÁ÷À´»ñÈ¡URLµÄÏìÓ¦

InputStream in = conn.getInputStream();
ByteArrayOutputStream bas= new ByteArrayOutputStream();

int len=0;

byte [] buf = new byte[1024];

while((len=in.read(buf))!=-1){
bas.write(buf,0,len);
}

//ת»»Îª×Ö·û´®
String result=bas.toString();

//ÉèÖÃÏûÏ¢¶ÔÏó
Message msg = Message.obtain();
//³É¹¦¾Í·¢ËÍSUCCESS
msg.what=SUCCESS;
msg.obj=result;
//·¢ËÍ
handler.sendMessage(msg);

} catch (Exception e) {
e.printStackTrace();
//³öÒì³£¾Í·¢ËÍERROR
Message msg = Message.obtain();

msg.what=ERROR;
handler.sendMessage(msg);
}
}
}.start();

}
}

5.ʹÓÃApacheHttpClient

/**
* ʹÓÃHttpClient×öÍøÂçÇëÇó 5.0¹ýÆÚ,6.0²»¿ÉÓÃ
*
* ½¨Á¢HttpClient¶ÔÏó getÇëÇó ½¨Á¢httpGet¶ÔÏó
* setParamsÀ´ÉèÖòÎÊý
* Ò²¿ÉÒÔ½«²ÎÊýÆ´½ÓÔÚURLµØÖ·ºóÃæ
* postÇëÇó ½¨Á¢HttpPost¶ÔÏó
* ÉèÖÃÇëÇóÌå
* setEntity
* new UrlEncodedFormEntity(List<? extends NameValuePair>)
* ÉèÖòÎÊý
*
* »ñÈ¡ÐÐÏìÓ¦Âë,ÅжÏ,
* »ñÈ¡ÐÐÏìÓ¦Ìå
public class MainActivity extends Activity {

private static final int SUCCESS = 1;
private static final int ERROR = 2;
private static final String TAG = "MainActivity";
/*
* ÇëÇóµÄ·¾¶
*/
private String path = "http://192.168.1.100:8080/Login/login";

private TextView show;

private EditText et_user;

private EditText et_pwd;

private HttpClient client;
* Handler ÏûÏ¢´¦Àí

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
* ³õʼ»¯
client = new DefaultHttpClient();

et_user = (EditText) findViewById(R.id.et_user);
et_pwd = (EditText) findViewById(R.id.et_pwd);

show = (TextView) findViewById(R.id.show);

handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
show.setText(msg.obj.toString());
break;
case ERROR:
Toast.makeText(MainActivity.this, "ÍøÂçÒì³£",
Toast.LENGTH_SHORT).show();
break;
}
}
};
}
* get ·½Ê½ÇëÇó
*
* @param v
* µ±Ç°×é¼þ

private String urlName ;
public void get(View v) {

String username = et_user.getText().toString().trim();

String password = et_pwd.getText().toString().trim();

if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {

Toast.makeText(this, "Óû§Ãû»òÕßÃÜÂë²»ÄÜΪ¿Õ", Toast.LENGTH_SHORT).show();
return;
}

try {
urlName = path + "?username="
+ URLEncoder.encode(username, "UTF-8") + "&password="
+ URLEncoder.encode(password, "UTF-8");
} catch (UnsupportedEncodingException e1) {

e1.printStackTrace();
}

/*
* getÇëÇó
*/
new Thread() {
@Override
public void run() {
try {
HttpGet get = new HttpGet(urlName);
/**
* ¿ÉÒÔʹÓÃHttpParamsÉèÖòÎÊý HttpParams params = new
* BasicHttpParams();
*/
// ¿ªÊ¼Ö´ÐÐ
HttpResponse response = client.execute(get);
// »ñÈ¡ÏìÓ¦Âë
int code = response.getStatusLine().getStatusCode();

if (code == 200) {
// »ñÈ¡ÄÚÈÝÏìÓ¦ÌåÖеÄÄÚÈÝ
InputStream in = response.getEntity().getContent();

ByteArrayOutputStream bas = new ByteArrayOutputStream();

int len = 0;
byte[] buf = new byte[1024];

while ((len = in.read(buf)) != -1) {
bas.write(buf, 0, len);
}
String result = bas.toString();
in.close();
//ÉèÖÃÏûÏ¢
Message msg = Message.obtain();

msg.what = SUCCESS;
msg.obj = result;
handler.sendMessage(msg);

} else {
Message msg = Message.obtain();

msg.what = SUCCESS;

handler.sendMessage(msg);

}

} catch (Exception e) {
e.printStackTrace();
}

}

}.start();

}
* post ·½Ê½ÇëÇó
* @param v
* µ±Ç°×é¼þ
* @throws UnsupportedEncodingException
*/
public void post(View v) {
final String username = et_user.getText().toString().trim();

final String password = et_pwd.getText().toString().trim();

if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {

Toast.makeText(this, "Óû§Ãû»òÕßÃÜÂë²»ÄÜΪ¿Õ", Toast.LENGTH_SHORT).show();
return;
}
/*
* postÇëÇó
*/
new Thread() {
@Override
public void run() {
try {
//½¨Á¢PostÇëÇó
HttpPost post = new HttpPost(path);

List<NameValuePair> parameters = new ArrayList<NameValuePair>();

parameters.add(new BasicNameValuePair("username", username));
parameters.add(new BasicNameValuePair("password", password));
//ÉèÖÃÇëÇóÌåÓë×Ö·û±àÂë
post.setEntity(new UrlEncodedFormEntity(parameters,"UTF-8") );

//Ö´ÐÐ
HttpResponse response = client.execute(post);
//»ñÈ¡ÏìÓ¦Âë
int code = response.getStatusLine().getStatusCode();

if (code == 200) {
// »ñÈ¡ÄÚÈÝÏìÓ¦ÌåÖеÄÄÚÈÝ
InputStream in = response.getEntity().getContent();

ByteArrayOutputStream bas = new ByteArrayOutputStream();

int len = 0;
byte[] buf = new byte[1024];

while ((len = in.read(buf)) != -1) {
bas.write(buf, 0, len);
}
String result = bas.toString();
in.close();
//ÉèÖÃÏûÏ¢
Message msg = Message.obtain();

msg.what = SUCCESS;
msg.obj = result;
handler.sendMessage(msg);

} else {
Message msg = Message.obtain();

msg.what = SUCCESS;

handler.sendMessage(msg);

}
} catch (Exception e) {
e.printStackTrace();
}

}

}.start();

}

}

WebView

goBack():ºóÍË

goForward():ǰ½ø

loadUrl(String url):¼ÓÔØÖ¸¶¨URLµÄÍøÒ³

boolean zoomln():·Å´óÍøÒ³

zoomOut():ËõÐ¡ÍøÒ³

²¼¾Ö

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<EditText
android:id="@+id/et_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="ÇëÊäÈëurlÍøÖ·"/>
<WebView
android:id="@+id/wv_show"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</LinearLayout>

Activity

/**
* WebViewСÐÍä¯ÀÀÆ÷
*
*/
public class MainActivity extends AppCompatActivity {

/*
½ÓÊÕÊäÈëµÄURL
*/
private EditText et_url;

/*
ÏÔÊ¾ÍøÒ³ÄÚÈÝ
*/
private WebView wv_show;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

et_url = (EditText) findViewById(R.id.et_url);

wv_show = (WebView) findViewById(R.id.wv_show);

}
@Override
public boolean onKeyDown(int keyCode,KeyEvent event) {

if(keyCode==KeyEvent.KEYCODE_MENU){

String urlStr = et_url.getText().toString().trim();
//¼ÓÔØ
wv_show.loadUrl(urlStr);

return true;
}

return false;
}

}

Ìí¼ÓȨÏÞ

<uses-permission android:name="android.permission.INTERNET"/>

7.ʹÓÃWebHTML¼ÓÔØHTML´úÂë

WebViewÌṩÁËÒ»¾ß

loadData(String data,String mimeType ,String encoding)·½·¨ÓÃÓÚ¼ÓÔØHTML,Õâ¸ö·½·¨¼ÓÔØÖÐÎÄʱ»áÓÐÂÒÂë

»¹ÓÐÒ»¸ö

loadDataWithURL(String data,String mimeType ,String encoding,String historyUrl)·½·¨ÊǵÚÒ»¸ö·½·¨µÄ¼ÓÇ¿,

data:Ö¸¶¨µÄHTML´úÂë

mimeType:Ö¸¶¨HTML´úÂëµÄMIMEÀàÐÍ,¶ÔÏóHTML´úÂë¿ÉÖ¸¶¨Îªtext/html

encoding:Ö¸¶¨HTML´úÂë±àÂëËùÓеÄ×Ö·û¼¯:UTF-8

²¼¾ÖÖÐÖ»ÓÐÒ»¸öWebView

/**

* WebViewÏÔʾHTML

public class MainActivity extends AppCompatActivity {

private WebView webView_show;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//»ñÈ¡webView×é¼þ

webView_show = (WebView) findViewById(R.id.webView_show);

StringBuilder sb = new StringBuilder();

sb.append("<html>");

sb.append("<head>");

sb.append("<title> »¶Ó­WebViewÏÔʾHTML</title>");

sb.append("</head>");

sb.append("<body>");

sb.append("<h1 align='center' style='color:red'>ÏÔʾÖÐÎıêÌâ</h1>");

sb.append("</body>");

sb.append("</html>");

//¼ÓÔØ²¢ÏÔʾHTMLÕâ¸öÖÐÎÄ»áÏÔʾÂÒÂë

//webView_show.loadData(sb.toString(),"text/html","utf-8");

webView_show.loadDataWithBaseURL(null,sb.toString(),"text/html","utf-8",null);

}

}

8.WebViewʹÓÃJavaScriptµ÷ÓÃAndroid

²½Öè:

1.µ÷ÓÃWebViewµÄget getSettings·½·¨»ñÈ¡WebSettings

2.ÆôÓÃJAVAScriptµ÷Óù¦ÄÜ

webSettings.setJavaScriptEnable(true)

3.µ÷ÓÃwebViewµÄaddJavaScript(Object obj,String name)·½·¨

4.ÔÚjavaScript½Å±¾ÖÐͨ¹ý¸Õ²Å±©Â¶µÄname¶ÔÏóµ÷ÓÃAndroid

5.¶ÔÏóµÄ·½·¨ÉϱØÐë¼ÓÉÏ×¢½â

Õâ¾ß×¢½âÖ»ÄÜÓÃÔÚ·½·¨

HtmlÔÚassetsĿ¼ÏÂ

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>JS µ÷ÓÃ</title>

</head>

<body>

<!-- ×¢Òâ´Ë´¦µÄmyObjÊÇAndroid±©Â¶³öÀ´µÄ¶ÔÏó -->

<input type="button" value="µ¯Toast"

onclick="person.show();"/>

<input type="button" value="ͼÊéÁбí"

onclick="person.showList();"/>

</body>

</html>

²¼¾Ö

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

<WebView

android:id="@+id/webView"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

</RelativeLayout>

JAVABean:

/**

public class Person {

private String name;

private int age;

private Context mContext;

public Person(Context context){

this.mContext = context;

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@JavascriptInterface

public void show(){

Toast.makeText(mContext,"ÐÕÃû"+this.name+",ÄêÁä:"+age,Toast.LENGTH_SHORT).show();

}

* Õâ¾ß×¢½âÖ»ÄÜÓÃÔÚ·½·¨

@JavascriptInterface

public void showList(){

new AlertDialog.Builder(mContext)

//ÉèÖñêÌâ

.setTitle("ÈËÔ±Áбí")

.setIcon(R.mipmap.ic_launcher)

.setItems(new String [] {"JAVA","Android","C++","C","PYTHON"},null)

.setPositiveButton("È·¶¨",null)

.setNegativeButton("È¡Ïû",null)

.create().show();

}

}

Activity

/**

* WebViewʹÓÃJavaScript

public class MainActivity extends AppCompatActivity {

private WebView webView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

webView = (WebView) findViewById(R.id.webView);

webView.loadUrl("file:///android_asset/test.html");

//»ñÈ¡WebViewÉèÖöÔÏó

WebSettings webSettings = webView.getSettings();

//ÆôÓÃjavaScript

webSettings.setJavaScriptEnabled(true);

Person person = new Person(this);

person.setName("ÕÅÈý");

person.setAge(18);

//´«µÝ¶ÔÏó

webView.addJavascriptInterface(person, "person");

}

}

   
3137 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ

ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ