1. 程式人生 > >實驗3:Android元件通訊

實驗3:Android元件通訊

程式設計實現:

(1)功能描述:

  • 主介面上有一個“登入”按鈕,點選“登入”按鈕後開啟一個新的Activity
  • 新的Activity上面有輸入使用者名稱和密碼的控制元件,在使用者關閉這個Activity後,將使用者輸入的使用者名稱和密碼傳遞到主介面中

(2)程式設計要點:

  • 主介面的Activity命名為MainActivity;啟動新的Activity命名為UserLoginActivity
  • 分別使用顯式啟動和隱式啟動的方式,啟動新的Activity
  • 使用者名稱中不能出現“@”等符號,同時長度不超過12個字元;密碼使用密碼文字顯示方式,即顯示為“******”方式,同時只能為數字*
  • 返回的使用者名稱和密碼要以Toast的方式顯示出來
  • MainActivity和UserLoginActivity中各個生命週期的回撥函式中要以Log.i方式顯示日誌資訊

程式碼片:

MainActivity.java

package com.example.experiment3_4_1;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import
android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity{ public static final String TAG="MainActivity"; @Override protected void onCreate(Bundle savedInstanceState){ super
.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); setContentView(R.layout.activity_main); Button button01=(Button)findViewById(R.id.button01); Button button02=(Button)findViewById(R.id.button02); button01.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ //顯式啟動 Intent intent01=new Intent(MainActivity.this,UserLoginActivity.class); startActivityForResult(intent01,1); } }); button02.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ //隱式啟動 Intent intent02=new Intent("com.example.activitytest.ACTION_START"); startActivityForResult(intent02,1); } }); } protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch(requestCode){ case 1: if(resultCode==RESULT_OK){ String returnedData=data.getStringExtra("data_return"); Toast.makeText(getApplicationContext(),returnedData.toString(), Toast.LENGTH_LONG).show(); } break; default: } /* super.onActivityResult(requestCode,resultCode,data); if(resultCode==RESULT_OK){ Uri uriData=data.getData(); Toast.makeText(getApplicationContext(),uriData.toString(), Toast.LENGTH_LONG).show(); } else{ Toast.makeText(getApplicationContext(),"使用者名稱和密碼為空", Toast.LENGTH_LONG).show(); } */ } @Override protected void onStart(){ super.onStart(); Log.i(TAG,"onStart"); } @Override protected void onResume(){ super.onResume(); Log.i(TAG,"onResume"); } @Override protected void onPause(){ super.onPause(); Log.i(TAG,"onPause"); } @Override protected void onStop(){ super.onStop(); Log.i(TAG,"onStop"); } @Override protected void onDestroy(){ super.onDestroy(); Log.i(TAG,"onDestroy"); } @Override protected void onRestart(){ super.onRestart(); Log.i(TAG,"onRestart"); } @Override public 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; } @Override public boolean onOptionsItemSelected(MenuItem item){ // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id=item.getItemId(); if(id==R.id.action_settings){ return true; } return super.onOptionsItemSelected(item); } }

UserLoginActivity.java

package com.example.experiment3_4_1;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class UserLoginActivity extends Activity {

    public static final String TAG="MainActivity";

    EditText editText1;
    EditText editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate");
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.userlogin);

        editText1=(EditText)findViewById(R.id.username);
        setEditTextInhibitInputSpecialChat(editText1);
        editText2=(EditText)findViewById(R.id.password);    
    }

    @Override
    public void onBackPressed(){
        String username=editText1.getText().toString();
        String password=editText2.getText().toString();
        String uriString="使用者名稱:"+username+"\n"+"密碼:"+password;
        Intent intent=new Intent();
        intent.putExtra("data_return",uriString);
        //Uri data=Uri.parse(uriString);
        //Intent intent=new Intent(null,data);
        if((username==null||username.length()<=0)&&(password==null||password.length()<=0)){
            Toast.makeText(getApplicationContext(),"使用者名稱和密碼為空",
                    Toast.LENGTH_LONG).show();
            finish();
        }
        else{
            setResult(RESULT_OK,intent);
            finish();
        }   
    }


    public static void setEditTextInhibitInputSpecialChat(EditText editText){

        InputFilter filter=new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                String specialChat="[`[email protected]#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
                Pattern pattern = Pattern.compile(specialChat);
                Matcher matcher = pattern.matcher(source.toString());
                if(matcher.find()||source.equals(" ")||dend>11)
                    return "";
                else 
                    return null;

            }
        };
        editText.setFilters(new InputFilter[]{filter});
    }

    @Override
    protected void onStart(){
        super.onStart();
        Log.i(TAG,"onStart");
    }

    @Override
    protected void onResume(){
        super.onResume();
        Log.i(TAG,"onResume");
    }

    @Override
    protected void onPause(){
        super.onPause();
        Log.i(TAG,"onPause");
    }

    @Override
    protected void onStop(){
        super.onStop();
        Log.i(TAG,"onStop");
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.i(TAG,"onDestroy");
    }

    @Override
    protected void onRestart(){
        super.onRestart();
        Log.i(TAG,"onRestart");
    }
}

程式碼分析:

  • 因為題目要求返回資料給上一個活動,所以採用startActivityForResult()的方法啟動活動。startActivty()方法接受兩個引數,第一個引數是Intent,第二個引數是請求碼。例如:這裡的請求碼只要是一個唯一值就可以,這裡傳入了1。
startActivityForResult(intent01,1);
  • 因為是使用startActivityForResult()方法來啟動UserLoginActivity的,在UserLoginActivity被銷燬之後會回撥上一個活動的onActivityResult()方法,所以需要在MainActivity中重寫這個方法來得到返回的資料。
protected void onActivityResult(int requestCode,int resultCode,Intent data){
        switch(requestCode){
        case 1:
            if(resultCode==RESULT_OK){
                String returnedData=data.getStringExtra("data_return");
                Toast.makeText(getApplicationContext(),returnedData.toString(),
                        Toast.LENGTH_LONG).show();
            }
            break;
        default:

        }
    }
  • 在UserLoginActivity中註冊點選事件,並在點選事件中新增返回資料的邏輯。我們先是構建了一個Intent,緊接著把要傳遞的資料存放在Intent中,然後呼叫了setResult()方法。這個方法專門用於向上一個活動返回資料。setResult()方法接受兩個引數,第一個引數用於向上一個活動返回處理結果,一般只用RESULT_OK或RESULT_CANCELED這兩個值,第二個引數則是把帶有資料的Intent傳遞回去,然後再呼叫finish()方法銷燬當前活動。
  • 因為題目沒有說明如何關閉UserLoginActivity,因此我選擇採用Android自帶的返回鍵來退出,即通過Back鍵回到MainActivity。所以需要重寫onBackPressed()方法。
@Override
    public void onBackPressed(){
        String username=editText1.getText().toString();
        String password=editText2.getText().toString();
        String uriString="使用者名稱:"+username+"\n"+"密碼:"+password;
        Intent intent=new Intent();
        intent.putExtra("data_return",uriString);
        //Uri data=Uri.parse(uriString);
        //Intent intent=new Intent(null,data);
        if((username==null||username.length()<=0)&&(password==null||password.length()<=0)){
            Toast.makeText(getApplicationContext(),"使用者名稱和密碼為空",
                    Toast.LENGTH_LONG).show();
            finish();
        }
        else{
            setResult(RESULT_OK,intent);
            finish();
        }   
    }
  • 因為題目要求使用者名稱中不能出現特殊符號,同時長度不超過12字元。這時我們可以使用系統提供的輸入過濾器InputFilter來過濾特殊字元。而在做長度限制時最簡單的方法就是在EditText中設定maxLength屬性。但是maxLength和InputFilter會起衝突。InputFilter()方法中dend引數即對長度進行限制。因此我們讓dend>11,就成功限制輸入長度為12個字元。注意:end是限制每次輸入長度的,而dend是限制總的輸入長度的。
public static void setEditTextInhibitInputSpecialChat(EditText editText){

        InputFilter filter=new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                String specialChat="[`[email protected]#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
                Pattern pattern = Pattern.compile(specialChat);
                Matcher matcher = pattern.matcher(source.toString());
                if(matcher.find()||source.equals(" ")||dend>11)
                    return "";
                else 
                    return null;

            }
        };
        editText.setFilters(new InputFilter[]{filter});
    }
  • Toast的用法是通過靜態方法makeText()創建出一個Toast物件,然後呼叫show()方法將Toast顯示出來。makeText()方法需要傳入三個引數。第一個引數是Context,第二個引數是Toast顯示的文字內容,第三個引數是Toast顯示的時長,有兩個內建常量可以選擇Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
Toast.makeText(getApplicationContext(),returnedData.toString(),Toast.LENGTH_LONG).show();

執行圖片:

登入介面

輸入介面

顯示介面

相關推薦

實驗3Android元件通訊

程式設計實現: (1)功能描述: 主介面上有一個“登入”按鈕,點選“登入”按鈕後開啟一個新的Activity 新的Activity上面有輸入使用者名稱和密碼的控制元件,在使用者關閉這個Activity後,將使用者輸入的使用者名稱和密碼傳遞到主介面中

android進階3step1Android元件通訊——Service基礎

轉:https://www.jianshu.com/p/95ec2a23f300 Android Service使用詳解   轉:https://www.jianshu.com/p/4c798c91a613 Android Service兩種啟動方式詳解(總結版

android進階3step1Android元件通訊——事件框架匯流排Otto

事件框架匯流排Otto 一、Otto是什麼? Otto是基於Guava專案的Android系統的一個EventBus模式類庫,如果你在Android程式開發的過程中想要不同的元件之間進行有效的通訊可以使用這個庫。通過Otto庫可以降低程式之間的耦合性。 二、Otto&nbs

android進階3step1Android元件通訊——廣播接收者BroadCast

轉:https://www.jianshu.com/p/ca3d87a4cdf3 前言 BroadcastReceiver(廣播接收器),屬於 Android四大元件之一 Broadcast是一種廣泛應用在程式之間傳輸資訊的機制,BroadcastReceiver是對傳

android進階3step1Android元件通訊——Application全域性應用

前言 Applicaiton類在 Android開發中非常常見,可是你真的瞭解Applicaiton類嗎? 本文將全面解析Applicaiton類,包括特點、方法介紹、應用場景和具體使用,希望你們會喜歡。 目錄 示意圖 1. 定義 代表應用程式(即 Andr

Android開發之旅3android架構

通過 圖集 例如 sqlit 組件 mil 大小 簡化 .html 引言 通過前面兩篇: Android 開發之旅:環境搭建及HelloWorld Android 開發之旅:HelloWorld項目的目錄結構 我們對android有了個大

2017-2018-2 20155230《網絡對抗技術》實驗3免殺原理與實踐

語言 code 編碼 病毒 div 就是 加密 網絡 殺毒軟件 基礎問題回答 1、殺軟是如何檢測出惡意代碼的? 殺軟檢測惡意代碼主要有三種方式: ①特征碼的檢測:殺毒軟件的病毒庫記錄了一些惡意軟件的特征碼,這些特征碼由一個不大於64字節的字符串組成,且是只有該病毒內

資料結構實驗3C++實現順序棧類與鏈棧類

                          

android進階3step2Android App通訊——經典藍芽通訊

  Android經典藍芽案例   - 一、Android中藍芽裝置的使用 - 1.藍芽許可權 - 2.藍芽功能開啟 - 3.搜尋藍芽裝置 - 4.建立RFCOMM通道 - 5.藍芽裝置雙向資料傳輸 1.開啟藍芽許可權:And

android進階3step2Android App通訊——Https和Http通訊

 需要了解的知識  X.509數字證書的結構與解析 計算機網路:這是一份全面& 詳細 HTTP知識講解  Https 實戰 • 主要用到的API介紹 – HttpsURLConnection (HttpURLConn

android進階3step2Android App通訊——Socket通訊

改:https://www.jianshu.com/p/089fb79e308b 掌握 Android中Socket程式設計,包括TCP和UDP通訊協議,以及加密傳輸、身份認證的網路協議Https的相關知識。 先掃一下盲:什麼是觀察者模式  埠號IP等網路基礎

android進階3step2Android App通訊 ——埠號IP等網路基礎知識掃盲

網路操作基礎知識 一、IP 地址和埠號   1) IP 地址用於在網路中唯一標識一臺機器(通訊實體),是一個 32 位整數,通常 用 4 個 0-255 的十進位制數標識; 2)&nbs

android進階3step2Android App通訊 ——觀察者模式

觀察者模式 一、什麼是觀察者模式? 觀察者模式即 Observer Pattern。 觀察者模式的主旨是定義物件間的一種一(被 觀察者 Observable)對多(觀察者 Observer)的依賴關係,當一個物件的狀態發生改變 時,所有依賴於它的物件都得到通

android進階3step2Android App通訊——Android執行緒間通訊

Android進階:網路與資料儲存—步驟1:Android網路與通訊(第2小節:Handler) https://blog.csdn.net/qq_17846019/article/details/82906216 Android進階:網路與資料儲存—步驟1:Android網路與通訊(第3小

android進階3step2Android App通訊——AIDL實現遠端服務的通訊

安卓介面描述語言AIDL 全稱:Android Interface definition language  作用:程序間的通訊介面(實現兩個程序資料共享) IBinder僅限於同一個程序間的資料共享 定義轉:https://www.jianshu.com

實驗3線性表綜合-順序表

1. 建立一個由n個學生成績的順序表,n 的大小由自己確定,每一個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。分別輸出結果。#include<iostream.h>    const int Max=38;  

Regular進階元件通訊

本文由作者鄭海波授權網易雲社群釋出。 背景 在元件化不斷深入的大環境下,無論使用哪種 MDV 框架都最終會遇到一個頭疼的問題,就是「跨元件通訊」。 下圖是個簡單的例子 這裡包含「事件通訊」和「資料通訊」兩個維度。 事件傳遞 為了將事件 click 從 

《資料結構與演算法A》實驗3字串的簡單加密

題目: Description 假設字串中只可能包含“大小寫英文字母”、“阿拉伯數字”和10種其他符號(包括:'!'、'#'、'@'、'+','-','*','?','$',':',';')。請編寫程式碼,當讀入一個字串(長度不超過50個字元)之後,使用順序表儲存字串,

【EDA】實驗3利用74161計數器晶片設計M=20的計數器

一.實驗內容 1.利用74161計數器晶片設計一個M=20的計數器 2.利用Quartus軟體進行設計和模擬 3.觀察模擬波形 二.實驗步驟 本次實驗採用Quartus軟體進行,詳細步驟同實驗1類似,相關內容可以參考:【EDA】實驗1:拼接4-16譯碼器,以下

網路通訊3TCP互動通訊

服務端實現 import ( "fmt" "net" "os" "strings" ) func CheckErrorS(err error) { if err != nil { fmt