Android用戶端與服務端互動之登陸樣本,android樣本

來源:互聯網
上載者:User

Android用戶端與服務端互動之登陸樣本,android樣本

今天瞭解了一下android用戶端與服務端是怎樣互動的,發現其實跟web有點類似吧,然後網上找了大神的登陸樣本,是基於IntentService的


1.後台使用簡單的servlet,支援GET或POST。這個servlet最終返回給前台一個字串flag,值是true或false,表示登入是否成功。

  servlet使用之前需要配置,主義servlet的servlet-name要和servlet-mapping的servlet-name一致,否則找不到路徑

 我是在myEclipse上建立的一個web service 項目,然後部署到tomcat伺服器上以便android用戶端訪問

<servlet><servlet-name>helloWorld</servlet-name><servlet-class>com.zhongzhong.wap.action.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>helloWorld</servlet-name><url-pattern>/queryOrder</url-pattern></servlet-mapping>


import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.zhongzhong.wap.bean.UserBean;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { resp.setContentType("text/html");          PrintWriter out = resp.getWriter();          Boolean flag = false;            String userName = req.getParameter("un");          String password = req.getParameter("pw");           if(userName.equals("htp")&&password.equals("123"))        {        flag = true;        }                else flag = false;        System.out.println("userName:"+userName+" password:"+password);        out.print(flag);          out.flush();          out.close(); }}

2.然後我是在安卓的ADT上建立一個安卓項目,建立兩個Activity,分別作為登入介面和登入成功介面。

<RelativeLayout 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"    tools:context=".MainActivity" >    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true"        android:layout_marginTop="40dp"        android:text="HelloWorld登陸樣本" />    <EditText        android:id="@+id/et_user"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/textView1"        android:layout_centerHorizontal="true"        android:layout_marginTop="33dp"        android:ems="10"        android:hint="請輸入帳號" >        <requestFocus />    </EditText>    <EditText        android:id="@+id/et_psw"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/et_user"        android:layout_centerHorizontal="true"        android:layout_marginTop="40dp"        android:ems="10"        android:hint="請輸入密碼"        android:inputType="textPassword" />    <Button        android:id="@+id/btn_login"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/et_psw"        android:layout_centerHorizontal="true"        android:layout_marginTop="37dp"        android:text="登陸" /></RelativeLayout>

<RelativeLayout 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"    tools:context=".NaviActivity" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true"        android:layout_marginTop="46dp"        android:text="登陸成功" /></RelativeLayout>


3.HTTP的訪問公用類,用於處理GET和POST請求

package com.example.logindemo;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import android.content.Entity;import android.util.Log;public class HttpUtil {// 建立HttpClient對象public static HttpClient httpClient = new DefaultHttpClient();public static final String BASE_URL = "http://192.168.3.14:8090/HelloWord/";/** *  * @param url *            發送請求的URL * @return 伺服器響應字串 * @throws Exception */public static String getRequest(String url) throws Exception {// 建立HttpGet對象。HttpGet get = new HttpGet(url);// 發送GET請求HttpResponse httpResponse = httpClient.execute(get);// 如果伺服器成功地返迴響應if (httpResponse.getStatusLine().getStatusCode() == 200) {// 擷取伺服器響應字串String result = EntityUtils.toString(httpResponse.getEntity());return result;} else {Log.d("伺服器響應代碼", (new Integer(httpResponse.getStatusLine().getStatusCode())).toString());return null;}}/** *  * @param url *            發送請求的URL * @param params *            請求參數 * @return 伺服器響應字串 * @throws Exception */public static String postRequest(String url, Map<String, String> rawParams)throws Exception {// 建立HttpPost對象。HttpPost post = new HttpPost(url);// 如果傳遞參數個數比較多的話可以對傳遞的參數進行封裝List<NameValuePair> params = new ArrayList<NameValuePair>();for (String key : rawParams.keySet()) {// 封裝請求參數params.add(new BasicNameValuePair(key, rawParams.get(key)));}// 佈建要求參數post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));// 發送POST請求HttpResponse httpResponse = httpClient.execute(post);// 如果伺服器成功地返迴響應if (httpResponse.getStatusLine().getStatusCode() == 200) {// 擷取伺服器響應字串String result = EntityUtils.toString(httpResponse.getEntity());return result;}return null;}}

4.IntentService服務,用於在後台以隊列方式處理耗時操作。

package com.example.logindemo;import java.util.HashMap;import android.app.IntentService;import android.content.Intent;import android.util.Log;public class ConnectService extends IntentService {private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";public ConnectService() {super("TestIntentService");// TODO Auto-generated constructor stub}@Overrideprotected void onHandleIntent(Intent intent) {// TODO Auto-generated method stub/**          * 經測試,IntentService裡面是可以進行耗時的操作的           * IntentService使用隊列的方式將請求的Intent排入佇列,          * 然後開啟一個worker thread(線程)來處理隊列中的Intent            * 對於非同步startService請求,IntentService會處理完成一個之後再處理第二個            */          Boolean flag = false;          //通過intent擷取主線程傳來的使用者名稱和密碼字串          String username = intent.getStringExtra("username");          String password = intent.getStringExtra("password");          flag = doLogin(username, password);          Log.d("登入結果", flag.toString());                    Intent broadcastIntent = new Intent();          broadcastIntent.setAction(ACTION_RECV_MSG);            broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);            broadcastIntent.putExtra("result", flag.toString());          sendBroadcast(broadcastIntent);  } // 定義發送請求的方法      private Boolean doLogin(String username, String password)      {          String strFlag = "";          // 使用Map封裝請求參數          HashMap<String, String> map = new HashMap<String, String>();          map.put("un", username);          map.put("pw", password);          // 定義發送請求的URL        String url = HttpUtil.BASE_URL + "queryOrder?un=" + username + "&pw=" + password;  //GET方式         // String url = HttpUtil.BASE_URL + "LoginServlet"; //POST方式          Log.d("url", url);          Log.d("username", username);          Log.d("password", password);          try {              // 發送請求              strFlag = HttpUtil.postRequest(url, map);  //POST方式  //          strFlag = HttpUtil.getRequest(url);  //GET方式              Log.d("伺服器傳回值", strFlag);          } catch (Exception e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                    if(strFlag.trim().equals("true")){              return true;          }else{              return false;          }                }  }

5。在AndroidManifest.xml中註冊IntentService。注意uses-permission節點,為程式開啟訪問網路的許可權。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.logindemo"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" />    <uses-permission android:name="android.permission.INTERNET" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.example.logindemo.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity            android:name="com.example.logindemo.NaviActivity"            android:label="@string/title_activity_navi" >        </activity>        <service android:name="com.example.logindemo.ConnectService" >        </service>    </application></manifest>

6.登陸介面處理,注意

  1. 按鈕監聽事件中,使用Intent將要傳遞的值傳給service。
  2. 接收廣播類中,同樣使用Intent將要傳遞的值傳給下一個Activity。
  3. 在onCreate()中,動態註冊接收廣播類的執行個體receiver。
  4. 在接收廣播類中,不要使用完畢後忘記登出接收器,否則會報一個Are you missing a call to unregisterReceiver()? 的異常。

package com.example.logindemo;import android.os.Bundle;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";private Button loginBtn;private EditText et_username;private EditText et_password;private String userName;private String passWord;private MessageReceiver receiver ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//動態註冊receiver            IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);            filter.addCategory(Intent.CATEGORY_DEFAULT);            receiver = new MessageReceiver();            registerReceiver(receiver, filter); }private void initView() {// TODO Auto-generated method stubet_username = (EditText)findViewById(R.id.et_user);et_password =( EditText)findViewById(R.id.et_psw);loginBtn = (Button)findViewById(R.id.btn_login);loginBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(matchLoginMsg()){// 如果校正成功                      Intent msgIntent = new Intent(MainActivity.this, ConnectService.class);                      msgIntent.putExtra("username", et_username.getText().toString().trim());                      msgIntent.putExtra("password", et_password.getText().toString().trim());                      startService(msgIntent); }}});}protected boolean matchLoginMsg() {// TODO Auto-generated method stubuserName = et_username.getText().toString().trim();passWord = et_password.getText().toString().trim();if(userName.equals("")){Toast.makeText(MainActivity.this, "帳號不可為空",Toast.LENGTH_SHORT).show();return false;}if(passWord.equals("")){Toast.makeText(MainActivity.this, "密碼不可為空",Toast.LENGTH_SHORT).show();return false;}return true;}//接收廣播類        public class MessageReceiver extends BroadcastReceiver {            @Override            public void onReceive(Context context, Intent intent) {               String message = intent.getStringExtra("result");               Log.i("MessageReceiver", message);          // 如果登入成功              if (message.equals("true")){                  // 啟動Main Activity                  Intent nextIntent = new Intent(MainActivity.this, NaviActivity.class);                  startActivity(nextIntent);                  // 結束該Activity                  finish();                  //登出廣播接收器                  context.unregisterReceiver(this);              }else{              Toast.makeText(MainActivity.this, "使用者名稱或密碼錯誤,請重新輸入!",Toast.LENGTH_SHORT).show();             }                        }        }    @Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}


運行:



轉載自http://blog.csdn.net/softwave


想學習一下android用戶端與服務端資料互動的知識?比如怎登入?怎把服務端的資料讀取出來顯示在用戶端

簽署-1整形,最高位為符號位為1表示負數,但儲存的電腦?的形式的補充-1實際儲存格式是11111111,如果您的用戶端讀取儲存時不帶正負號的整數當然是255的代碼是簡單的傳回值的檢查,最好的伺服器和用戶端的位元組流讀取和寫入。希望可以幫到你,謝謝採納
 
與Android用戶端互動的伺服器端開發

C/S也可以
B/S也可以,Client再解析下返回的資料
B/S的話,JAVA PHP ASP.NET都可以
XML返回,JSON返回都可以
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.