當前位置:首頁 > IT技術 > 移動平臺 > 正文

Android開發(fā)——四大組件之Activity
2021-09-05 09:10:20

<1>關于Activity和AndroidManifest

我們AS項目里的AndroidManifest.xml文件其實就是一個清單文件,用于描述我們的項目內容

其中包含了一些Application、activity、包名等信息,還包括一些權限的聲明(例如在數據存儲時使用SD卡讀寫的權限聲明)

四大組件也都需要在這里注冊之后才能使用

?

Application就代表一個應用程序,其中可以包含四大組件

而Activity是用于處理用戶操作,與用戶進行交互的(可以理解為一個容器,一個窗口,主要用于承載UI內容)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidactivitydemo">  //包名

//這兩行就是設置權限,允許外置存儲卡讀寫操作 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  //一個application就代表了一個應用程序 <application android:allowBackup="true" //允許系統(tǒng)備份 android:icon="@mipmap/ic_launcher" //設置應用的桌面圖標(這些圖標存儲在res文件夾的mipmap里的lc_launcher下) android:label="@string/app_name" //設置應用程序的名稱(它存儲在res文件夾的values下的strings里) android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" //支持從右到左 android:theme="@style/Theme.AndroidActivityDemo"> //用于控制樣式(它存儲在res文件夾的values下的themes里) <activity android:name=".MainActivity" //四大組件的靜態(tài)注冊都要這樣 android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

?

如何在一個Application中再新建一個activity呢?(即如何再新建一個UI窗口)

——首先新建一個類SecondActivity,這個類繼承Activity

——重寫其中的onCreate()方法

——然后再新建一個布局activity_second,在SecondActivity類中setContentView()顯示這個布局

——最后要使這個新的Activity可以使用,需要在配置列表里注冊一下

可以看到,在一個application中注冊了有兩個activity,一個標簽設置為“第一個ActivityDemo”,另一個設置為“第二個ActivityDemo”,同時給了兩個intent-filter,都聲明的是主入口

所以最終的結果是,在手機中有兩個app圖標,都可以打開這個程序,分別是這個程序的兩個界面

?

<2>利用顯式意圖來實現界面跳轉

(顯式Intent:按名稱(完全限定類名)指定要啟動的組件)

用一個案例來學習顯式意圖的界面跳轉(目標是在主界面輸入賬號和密碼,點擊登錄按鍵后,跳轉到另一個界面,并在其中顯示我們輸入的賬號和密碼)

——首先,在MainActivity中和原來一樣,通過id找到我們輸入的賬號和密碼

——然后判斷賬號和密碼是否為空,如果不為空,則創(chuàng)建一個意圖對象 Intent ,把我們的賬號和密碼的值存儲到這個對象里 putExtra()方法,存儲了鍵值對

——調用startActivity()方法進行界面的跳轉

——新建一個類SecondActivity,繼承Activity并重寫其中的onCreate()方法

——這個activity記得要在配置清單中聲明一下才能使用

——最后在SecondActivity類中的onCreate方法里,getIntent()得到第一個界面中我們創(chuàng)建的意圖對象,然后獲取其中的內容并顯示

——最終效果如下

?

<3>利用隱式意圖來實現界面跳轉

(隱式Intent:不會指定特定的組件,而是聲明要執(zhí)行的常規(guī)操作,從而允許其他應用中的組件來處理它)

隱式意圖實現界面跳轉的方式和顯式差不多,主要差別就是創(chuàng)建Intent的方法

?

<4>區(qū)別

顯式意圖:也就是可以直接看到我們要跳轉到的目標組件,例如之前要從MainActivity跳轉到SecondActivity,用的是new Intent(this, SecondActivity.class);在這里面我們直接就可以看到目標組件的名稱(一般是用于應用內組件的跳轉)

隱式意圖:用于跳轉到第三方應用(一般是用于各個應用之間的跳轉)

?

——創(chuàng)建顯式意圖的幾種寫法:

//第一種:

Intent intent = new Intent();

intent.setClassName("包名","類名");

startActivity(intent);

?

//第二種:

Intent intent = new Intent();

ComponentName componentName = new ComponentName("包名","類名");

startActivity(intent);

?

//第三種:

Intent intent = new Intent(this, 要跳轉的界面類名.class );

startActivity(intent);

其實還有很多種寫法,沒有全部列出來

創(chuàng)建顯式意圖主要就是要找到組件的名稱 ComponentName = 包名/類的路徑名稱

由于顯式意圖主要是用在應用內部各個組件之間的跳轉,所以第三種方式就很方便

?

——創(chuàng)建隱式意圖

隱式意圖的創(chuàng)建步驟為:

創(chuàng)建Intent對象

給這個intent對象設置Action,設置它的category值,設置包名(可以在Android系統(tǒng)源碼里查找過濾器 intent-filter 查看各個系統(tǒng)應用的action值和category值)

使用startActivity()方法跳轉到另一個界面

Intent intent = new Intent();

intent.setAction(" 目標應用的組件的action值? ");

intent.setCategory(" 目標應用的組件的category值 ");

intent.setPackage(" 目標應用的組件的包名 ");

startActivity(intent);

采用這種方式,在創(chuàng)建和使用的時候我們是看不見這個組件的名稱的,只通過它的action值,category值和包名就可以使用了

?

<5>組件之間的數據傳遞

Activity之間的數據傳遞和組件之間的數據傳遞是一樣的

數據傳遞又分為兩種:1 基本數據類型的數據傳遞??? 2? 引用數據類型的數據傳遞(對象的傳遞)

?

——基本數據類型數據的傳遞

直接創(chuàng)建一個意圖intent,調用intent中的putExtra()方法就可以把基本數據類型的數據以鍵值對的形式存儲在這個intent中

然后切換界面,在接收界面中首先getIntent()拿到這個intent對象,然后再用intent.getExtra()方法用鍵獲取到相應的值即可

?

——引用數據類型數據的傳遞

其實引用數據類型的傳遞和基本數據類型的數據傳遞方式差不多,都是利用了putExtra()和getIntent()兩個方法,不同的是引用數據類型的數據在傳遞前必須要把數據序列化

要把數據序列化,就是要在傳遞的對象的類中實現Parcelable接口或者實現Serializable接口

Parcelable接口是Google自定義的接口,使用起來比較高效,直接將數據存儲到內存中,然后傳遞

Serializable接口則是Java自帶的,是寫到持久化存儲單元里然后再傳遞的,比較慢

例如我們要傳遞一個user對象,首先要對User類實現可序列化的接口

然后再傳遞

(需要注意的是,String類和Bitmap類本身就以及實現了序列化接口的,所以在傳遞string類型數據或bitmap類型的數據的時候,不需要再對其實現序列化接口,直接和基本數據類型傳遞一樣的使用就可以了)

?

?

?

?

來寫一個撥打電話的按鍵,練習一下用協(xié)議來傳數據:

?

?注意要在配置清單中打開打電話的權限

?

?類似的打電話,發(fā)短信,或者操作其他應用的都可以通過這種方法,在Android源碼中找到相應的參數,通過創(chuàng)建隱式意圖的方法進行跳轉和根據其中規(guī)定的協(xié)議進行數據傳輸

?

——也可以自己按這種方法定義界面操作,在配置清單中配置一下即可,其中 action 內容就是包名.應用名稱 , category 意思就是這個應用的類別(例如DEFAULT就表示這是一個應用),data 后面可以自己設置約束

然后通過隱式意圖,填寫相關的配置信息,就可以跳轉到該應用界面并傳輸數據

?

?<6>Activity之間的數據回傳

例如我們發(fā)微信朋友圈的時候,需要從朋友圈編輯界面先跳轉到相冊界面,選擇想要發(fā)布的相片,然后選完之后會自動返回到朋友圈的編輯界面,并且選中的相片會傳到這里

這種類似的情況就用到了Activity之間的數據回傳

數據回傳和跳轉界面差不多,主要的區(qū)別在于數據回傳要用到startActivityForResult(intent)這個方法而不是startActivity(intent)方法

?

寫一個充值的例子來練習,具體要求是:

在主界面點擊充值按鍵,跳轉到充值界面,在充值界面充值等操作后,自動返回到主界面并顯示操作結果

主界面中的操作

?

?支付界面的操作

?

?

?

?

?主要的思路就是,主界面調用startActivityForResult(intent,requestCode<1> )方法

在充值界面中,當完成充值操作會調用setResult(resulCode<2> , intent)方法,當完成取消充值會調用setResult(resultCode<3> ,intent)方法

在主界面中重寫onActivityResult()方法,在這個方法中通過判斷requestCode來確定返回數據應該去到哪個部位

通過判斷resultCode來判斷跳轉的那個界面到底做了什么操作,用data.getExtra()方法獲取到相應操作的數據結果

?

本文摘自 :https://www.cnblogs.com/

開通會員,享受整站包年服務立即開通 >