官方文檔-activity
Activity 提供窗口,供應在其中多個界面。此窗口通常會填滿屏幕,但也可能小于屏幕并浮動在其他窗口之上。
大多數應用包含多個屏幕,這意味著它們包含多個 Activity。通常,應用中的一個 Activity 會被指定主 Activity,即用戶啟動應用時顯示的第一個屏幕。然后,每個 Activity 都可以啟動另一個活動,以執(zhí)行不同的操作。
Activity提供一個能讓用戶操作并與之交互的界面。
AppCompatActivity
AppCompatActivity 繼承了 Activity 類,擁有了窗口的特性,是一個可視化界面,MainActivity是一個可視化界面正是由于它繼承了 AppCompatActivity。
配置清單
聲明文件 Activity
在清單文件中聲明 Activity,添加<activity>元素作為<application>元素的子元素,如:
<manifest ... > ? <application ... > ? ? ? <activity android:name=".ExampleActivity" /> ? ? ? ... ? </application ... > ? ... </manifest >
?android:name,必需屬性,用于指定Acitiviy的類名稱。
該步驟在新建activity文件時會自動創(chuàng)建
IntentFilter 意圖過濾器?
<action android:name="xxxxx" />????????action表示動作,就是想要做的事情的名稱,給當前actitvity起別名,但不能亂起
<category android:name="android.intent.category.DEFAULT" />? ? ? ? 指定當前活動的類型
<data android:mimeType="text/plain" />? ? ? ? 指定活動能發(fā)送的類型
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
?android.intent.action.MAIN -> 入口activity
Intent
Intent是 Activity、Serviece和 BroadcastReceiver三個應用組件之間進行通信的信使,它還可以攜帶數據。
Intent分類
顯示意圖:明確目標組件的意圖
Intent(Context packageContext, Class<?> cls)
常用在操作當前應用的組件
隱式意圖:沒有明確目標組件的意圖
Intent(String action)
常用在使用其他應用的組件時
activity 的啟動(跳轉)
?activity的跳轉
Intent intent = new Intent(ButtonActivity.this,MainActivity.class);
startActivity(intent);
一般啟動?
隱式啟動使用隱式意圖
在運行時才知道能打開哪一個界面
隱式啟動的兩種構造方法 * public Intent(String action, Uri uri) * public Intent(String action) * action:Activity的別名 ,編譯階段無論寫什么的都不會報錯 * uri: Uri對象,打開的路徑
// 打開百度?
Intent intentS = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intentS);
顯示啟動使用顯式意圖
在運行前知道到底要啟動哪一個界面-使用意圖
Intent(Context packageContext, Class<?> cls)
一般返回
跳轉后返回只需要使用 finish() 結束當前activity?
帶回調啟動
startActivityForResult(Intent intent,int requestCode);
跳轉到第二個頁面,設置請求碼為1000
Intent intent = new Intent(this,ActivityLife.class);
// 參數2:請求碼
startActivityForResult(intent,1000);
帶結果的返回
setResult(int resultCode,Intent data) 設置要返回的結果?
第二個頁面返回數據:
// 通過startActivityForResult啟動activity-返回結果
public void backRes(View view) {
// 設置結果
Intent intent = new Intent(); //此時intent不作為跳轉使用,而是用來傳遞返回的數據
intent.putExtra("返回的數據","第二個界面返回的是10000000");
/*參數1:請求碼 參數2:返回的數據*/
setResult(RESULT_OK,intent);
finish(); //結束當前Acticity
}
?在第一個頁面調用 onActivityResult 方法處理返回的數據:
如果通過 startActivityForResult 啟動了第二個activity,當第二個activity處理結束后,再回到當前activity時,一定會自動回調 onActivityResult 方法 。在 onActivityResult 方法中我們可以處理第二個activity返回的結果。(如。拍照后得到的照片,從圖庫中選取的圖片)
- 參數1 requestCode:請求碼。當有多個 startActivityForResult 時,可以用來判斷該結果來自于哪個activity,從而進行什么操作
- 參數2 resultCode:結果碼 0 = RESULT_CANCEL->取消 | -1 = RESULT_OK 正確處理后返回。判斷它是為了判斷新開的activity有沒有處理完這些事
- 參數3 Intent (可以為空):返回的結果存放在這里。通過 getStringExtra() 獲取數據(此時已經知道結果是String類型的數據)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 判斷新開的activity返回的結果
/* 當返回結果都是成功時,請求碼==1000則進行操作 */
if(resultCode == -1){
if(requestCode == 1000){
assert data != null;
Log.e("ActivityWithResults","自動進入onActivityResult requestCode:"+requestCode+",resultCode:"+resultCode+",返回的數據"+data.getStringExtra("返回的數據"));
}
}
Intent攜帶數據?
intent.putExtra(String name,XXX value) 保存數據
intent.getXXXExtra(String name) 獲取數據
activity 之間數據傳遞
getIntent()獲取攜帶數據的意圖
-
傳遞簡單內容
A的activity(傳遞)
Intent intent = new Intent(this,ActivityLife.class);
//添加參數
intent.putExtra("傳遞的String類型參數","這是上一個頁面?zhèn)鬟f過來的String類型參數");
intent.putExtra("傳遞的double類型參數",24.99);
intent.putExtra("傳遞的int類型參數",24);
intent.putExtra("傳遞的bool類型參數",false);
startActivity(intent);
B的activity(接收)
// 獲取上一個頁面?zhèn)鬟f過來的數據,獲取數據時有些需要給出默認值
Intent getIntent = getIntent();
String dataString = getIntent.getStringExtra("傳遞的String類型參數");
int dataInt = getIntent.getIntExtra("傳遞的int類型參數",1);
double dataDouble = getIntent.getDoubleExtra("傳遞的double類型參數",2.1);
boolean dataBool = getIntent.getBooleanExtra("傳遞的bool類型參數",true);
TextView textView = findViewById(R.id.show);
textView.setText("上一個頁面?zhèn)鬟f是數據"+dataString+dataInt+dataDouble+dataBool);
-
傳遞對象內容?
intent.getSerializableExtra(String name)? 獲取序列化對象數據
新建一個Student對象類
package com.example.androidstudiostudy.data;
import java.io.Serializable;
// 將對象序列化,序列化的作用
/* 1.想把內存中的對象保存到一個文件活數據庫中時
* 2.想利用套接字Socket在網絡中傳遞對象*/
public class Student implements Serializable {
private String name;
private int age;
private double money;
private boolean check;
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;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public boolean isCheck() {
return check;
}
public void setCheck(boolean check) {
this.check = check;
}
public Student(String name, int age, double money, boolean check) {
this.name = name;
this.age = age;
this.money = money;
this.check = check;
}
}
A頁面?zhèn)鬟f:
// 實例化一個新建的 Student 對象
Student student1 = new Student("沈成林",23,200000.999,true);
// 參數1:String name - 本次數據的名稱
// 參數2:@Nullable Serializable value - 序列化數據對象
intentC.putExtra("data_object",student1);
startActivity(intentC);
B頁面接收:?
Intent getIntent = getIntent();
// 獲取對象數據 - 強轉成 Student 對象
Student student = (Student) getIntent.getSerializableExtra("data_object");
if (student != null) {
TextView textView2 = findViewById(R.id.show2);
textView2.setText("上一個頁面?zhèn)鬟f是數據"+student.getName()+student.getAge()+student.getMoney()+student.isCheck());
else {
// 處理student對象為空的情況,比如給出一個默認值或者顯示錯誤信息
TextView textView2 = findViewById(R.id.show2);
textView2.setText("上一個頁面未傳遞有效的Student對象");
}
activity 的生命周期
- onCreate()?在系統(tǒng)創(chuàng)建?activity 時觸發(fā),完成加載布局和初始化的工作。
- onStart() 可以理解為啟動狀態(tài),此時的界面還沒能完全的展示出來, 還在準備中
- onResume() 說明activity已經完全進入到了前臺準備完成,可以和用戶進行交互了,只有經歷此方法,才能進入運行狀態(tài)。
- onPause() 當activity進入到不可操作的狀態(tài)時,會回調該方法。
何時會進入到不可操作的狀態(tài)?
有另一個activity進入到了前臺(本activity被部分擋住了)。此時雖然不可操作,但是部分可見的
- onRestart()
- onStop() 當activity完全看不到了,就會回調該方法
- onDestory() 當要退出activity的時候,就會執(zhí)行這個方法
當有一個活動A來到前臺完全啟動后,有一個活動B也來到前臺,慢慢啟動時,A就會進入到onPause()方法,暫?;顒?,當B完全準備好后,A就會徹底的停止,進入onStop()方法
activity的四種狀態(tài)
- 運行狀態(tài):可見且可操作
- 暫停狀態(tài):可見但不可操作
- 停止狀態(tài):不可見,但對象存在
- 死亡狀態(tài):對象不存在
activity 狀態(tài)變化
運行-死亡:onPause() ->onStop()->onDestory()
死亡-運行:onCreate() ->onStart()->onResume()
運行-停止:onPause() ->onStop()
停止-運行:onRestart()->onStart()->onResume()
運行-暫停:onPause()
暫停-運行:onResume()
activity的Task Stack(任務棧?)
棧:后進先出
一個應用啟動,系統(tǒng)就會為其創(chuàng)建一個對應的任務棧來存儲并管理該應用的Activity對象。
只有棧頂的activity才會被顯示。
系統(tǒng)中會有多個應用,同時也會有多個任務棧。
當前應用的任務棧會在我們打開其他應用或者轉到主屏幕時轉移到后臺,在后臺時,任務中的所有 activity 都會停止,但任務的返回堆棧保持不變,即當其他任務發(fā)生時,任務會失去焦點。
?當它回到前臺時,會從上次停下的地方繼續(xù)執(zhí)行。
由于返回堆棧中的 activity 絕不會重新排列,因此,應用中的一個 activity 可能會多次實例化,即使來自不同的任務也是如此,如果不想啟動多次,可以管理activity的啟動模式。
activity 的四種啟動(加載)模式
Standard? 標準模式 (默認)
每一次調用startActivity()都會創(chuàng)建一個新的實例,不管棧內是否存在該實例,打開就會放入任務棧,返回時依次從后退棧。
在清單文件中設置啟動模式:
android:launchMode="standard"
SingleTop 頂部復用
頂部是你正想要打開的activity,直接復用,不會新建實例,如果沒有,則會新建實例再放入棧中。
注意,一定要在頂部,不然退棧順序和標準模式一樣
?在清單文件中設置啟動模式:
android:launchMode="singleTop"
從MainActivity -> MainActivity->MainActivity->?MainActivity
此時頂部就是要打開的activity,直接復用,所以只返回一次就到了主頁
SingleTask 棧內復用模式
想打開已經打開過的 activity B,此模式會保證棧中只有一個,會彈出B之后的所有activity,保證它重回棧頂
android:launchMode="singleTask"
MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity
只返回一次就回到主頁,因為此時想打開MainActivity,但棧中此時已經有了,根據棧內復用的特性它會退出MainActivity后的所有activity, ButtonActivity ->ConstraintActivity
SingleInstance 全局唯一模式
想要打開新activity,會放在一個新的任務棧中且該Task有且只有一個activity實例,如果已經創(chuàng)建過該activity實例,則不會再創(chuàng)建新的任務棧,只會將之前的喚醒。
<activity
android:launchMode="singleInstance"
android:name=".MainActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity
返回到ButtonActivity后再返回就直接回到了主頁。這是由于MainActivity在一個單獨的任務棧中,在第一次返回的時候已經被撤銷了。文章來源:http://www.zghlxwxcb.cn/news/detail-855939.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-855939.html
到了這里,關于Android --- Activity的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!