網(wǎng)站首頁 編程語言 正文
Intent
Intent是Android程序中個組件之間進行交互的一種重要方式,它不僅可以指明當(dāng)前組件想要執(zhí)行的動作,可以指定你想要啟動的活動,也可以在不同組件之間傳遞數(shù)據(jù)。
第一部分:通過intent來啟動一個活動
Intent 分為顯示和隱式
我們先來了解一下顯示
其中一個常用的構(gòu)造方法是:
Intent intent=new Intent(registActivity.this,showActivity.class);
//這樣我們構(gòu)造出了一個Intent
第一個參數(shù)為Context,要求提供一個活動的上下文(告訴這個操作你要讓誰來執(zhí)行)
第二個參數(shù)為class ,則表示你要啟動的目標(biāo)(表示你要執(zhí)行哪個程序)這里是引用
通過這個構(gòu)造方法,你就已經(jīng)構(gòu)造好了Intent意圖
接下來就開始使用這個Intent意圖
通過startActivity()方法啟動目標(biāo)這里是引用
隱式
當(dāng)無法確定意圖目標(biāo),即目標(biāo)組件名稱時,使用隱式Intent啟動。通常用于啟動其他應(yīng)用的組件。
例如:隱式Intent啟動系統(tǒng)默認(rèn)瀏覽器:
//準(zhǔn)備Intent的data屬性數(shù)據(jù)
Uri uri=Uri.parse("http://www.baidu.com");
//設(shè)置Intent的action屬性和data屬性
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
//啟動目標(biāo)意圖
startActivity(intent);
第二部分:通過Intent向下一個活動傳遞數(shù)據(jù)
Intent提供了一系列putExtra()方法的重載
相當(dāng)于先把我們想要傳遞的數(shù)據(jù)暫時存在intent中,當(dāng)我們啟動了另一個活動后,只需把這些數(shù)據(jù)再從Intent取出。
private void passdate()
{
//創(chuàng)建意圖對象
Intent intent=new Intent(registActivity.this,showActivity.class);
//把數(shù)據(jù)存入intent
intent.putExtra("name",et_name.getText().toString().trim());
intent.putExtra("password",et_password.getText().toString().trim());
//開啟意圖
startActivity(intent);
}
注意:通過顯示意圖啟動了showActivity,并通過putExtra()方法傳遞一個字符串,putExtra()方法接收兩個參數(shù),第一個參數(shù)是鍵:用于后面intent中的取值,第二個參數(shù)才是我們真正想要傳遞的數(shù)據(jù)
//獲得開啟頁面的意圖對象
Intent intent=getIntent();
//根據(jù)key取出對應(yīng)的value值
String name=intent.getStringExtra("name");
String password=intent.getStringExtra("password");
//把用戶名和密碼展示到控件上(覆蓋到控件的位置上)
TextView tv_name=(TextView) findViewById(R.id.tv_name);
TextView tv_password=(TextView) findViewById(R.id.tv_psw);
tv_name.setText(name);
tv_password.setText(password);
- 首先獲取上一個活動的intent對象,通過getIntent()方法獲取啟動showActivity的intent
- 然后調(diào)用getStringExtra方法,傳入相應(yīng)的鍵值,就可獲取傳遞的數(shù)據(jù)
- 如果你想傳遞的是整形則getIntExtra()方法獲取數(shù)據(jù),以此類推
- 最后,通過setText()開始執(zhí)行,把我們的數(shù)據(jù)展示在控件的位置上
第三部分:返回數(shù)據(jù)給上一個活動
我們通常使用startActivityForResult()方法,這個方法也是用于啟動活動,只不過他能夠在活動銷毀后,返回一個結(jié)果給上一個活動
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText editText1 = (EditText) findViewById(R.id.et_name);
Button button1 = (Button) findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, showActivity.class);
Bundle bundle = new Bundle();
bundle.putCharSequence("name", (CharSequence) editText1.getText().toString());
//通過bundle來保存數(shù)據(jù)
intent.putExtras(bundle);
startActivityForResult(intent, 1);//和startActivity很像,就多了個請求碼用于后面判斷數(shù)據(jù)來源
}
});
startActivity()方法接收兩個參數(shù),第一個參數(shù)是Intent,第二個參數(shù)是請求碼,用于之后回調(diào)判斷數(shù)據(jù)來源
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
final EditText editText2= (EditText) findViewById(R.id.show_name);
Button button2=(Button) findViewById(R.id.show_button);
//獲取上個活動的intent和bundle
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(showActivity.this,MainActivity.class);
Bundle bundle=new Bundle();
bundle.putCharSequence("edit",(CharSequence) editText2.getText().toString());
intent.putExtras(bundle);
//setResult方法用于給上一個活動傳遞數(shù)據(jù),第一個參數(shù)是返回上一個活動的結(jié)果,第二個參數(shù)是將帶有數(shù)據(jù)的intent傳過去
setResult(1,intent);
finish();
}
});
}
在showActiviity活動中,也構(gòu)建了一個Intent,這個Intent是用來傳遞數(shù)據(jù),
通過調(diào)用setResult()方法專門給上一個活動返回數(shù)據(jù),setResult()方法接收兩個參數(shù),第一個參數(shù):用于向上一個活動返回處理結(jié)果,一般使用RESULT_OK或RESULT_CANCELED兩個值,第二個參數(shù)則將帶有數(shù)據(jù)的Intent傳遞回去,最后通過finish()銷毀當(dāng)前的活動
//在showActivity中的finish被銷毀后,會回調(diào)上 一個活動的onActivityResult()方法,因此我們要在MainActivity里重寫這個方法
@Override
//requestCode就是我們啟動時傳入的請求碼,resultCode是返回數(shù)據(jù)時傳入的,data攜帶返回數(shù)據(jù)的intent
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_FIRST_USER) {//通過請求碼來判斷數(shù)據(jù)的來源
et_name = (EditText) findViewById(R.id.et_name);
et_name.setText(data.getStringExtra("edit"));//從data中取值并輸出
//通過getStringExtra來獲取傳遞的數(shù)據(jù)
}
break;
default:
}
}
由于我們是使用startActivity()方法來啟動SecondActivity的,在SecondActivity被銷毀后就會回調(diào)上一個活動的onActivityResult()方法,所以我們要在上一個活動中重寫這個方法得到返回數(shù)據(jù)。
OnActivityResult()方法帶有三個參數(shù),=第一個參數(shù)requestCode,啟動活動的請求碼,第二個參數(shù)resultCode,返回數(shù)據(jù)的處理結(jié)果,第三個參數(shù),攜帶返回數(shù)據(jù)的intent,由于一個活動有可能會調(diào)用startActivityForResult()去啟動很多不同的活動,每一個活動都會返回數(shù)據(jù)回調(diào)onActivityResult()這個方法,所以為了安全一般使用Switch語句來進行判斷
通過resquestCode判斷數(shù)據(jù)來源,resultCode判斷處理結(jié)果是否成功,最后通過data中取值并打印出來
android中Intent和Bundle之間的關(guān)系
打個比方: 中國向美國海運箱裝的水果
中國就是Activity1,美國是Activity2, 海運則是 Intent,裝水果的箱子則是bundle,箱子上的編號就時key,水果就時data。
中國通過new一個intent對象指定意圖為 海運到美國 ,通過putExtras把箱裝的水果放至海運的路上。
美國先要通過getIntent的方法獲取海運的對象,然后通過getExtras獲得箱子,再根據(jù)箱子上的編號獲得水果。
如果Intent傳遞的數(shù)據(jù)只有一個,那么就直接用Intent的putExtra()方法直接放進參數(shù)即可。那如果Intent需要傳遞的是好幾個參數(shù),或者是一個類,那么這時候就需要用到Bundle
原文鏈接:https://blog.csdn.net/ChenYiRan123456/article/details/116310023
相關(guān)推薦
- 2022-09-14 apache虛擬主機配置的三種方式(小結(jié))_Linux
- 2021-12-15 Redis可視化工具Redis?Desktop?Manager的具體使用_Redis
- 2022-01-07 vite + element項目按需引入后將語言設(shè)置為中文
- 2022-10-13 Android自定義View實現(xiàn)進度條動畫_Android
- 2022-09-23 MongoDB慢查詢與索引實例詳解_MongoDB
- 2021-12-05 Go語言配置數(shù)據(jù)庫連接池的實現(xiàn)_Golang
- 2022-07-15 關(guān)于在Redis中使用Pipelining加速查詢的問題_Redis
- 2022-05-03 使用EF的Code?First模式操作數(shù)據(jù)庫_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支