Android中intent的使用
intent,顧名思義,是一種目的,不僅可以指明當前組件的目的,也可以傳遞數據。intent的使用非常廣泛,本文只在啓動活動方面做一些介紹,如有不對或者補充的地方,歡迎指出。
顯式intent跳轉Activity
顯式intent,即是一種非常明顯的目的。由當前Activity跳到指定的Activity。使用的方式爲,先構造一個intent,傳入當前的Activity與需要跳轉到的Activity。然後再啓用Intent。
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
當配合Button組件使用時,即按下按鈕跳轉到另一個Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=(Button)findViewById(R.id.bu01);
//buo1爲xml界面定義的buttonID
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,SecondActivity.class);//SecondActivity爲目的Activity
startActivity(intent);
}
});
}
隱式intent跳轉Activity
隱式intent就比較含蓄,它的原理有點類似於相親,你並不知道你要轉到哪個Activity,但是你對心儀的對象有一些小要求,而恰好你相親的對象能滿足你的條件,那麼恭喜你,相親成功(當前Activity也就轉到了你相親對象的Activity)。而我們需要做的,就是給(目標對象)Activity添加響應信息,給(你)原Activity添加響應要求。
怎麼做呢,
第一步:咱們先給目標對象添加響應信息吧,具體的是在XML的目標對象下配置一個信息,舉例
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.intent.ACTION_START"/>
<category android:name="android.intent,category,DEFAULT"/>
</intent-filter>
</activity>
我們在SecondActivity內添加了兩個信息,一個是action,一個是category,可以簡單理解爲外貌與三觀(此處斜眼笑),具體的信息在引號內,隨你寫。
第二步:咱們給原Activity添加要求
button1.setOnClickListener(new View.OnClickListener() {/隱式intent
@Override
public void onClick(View v) {
// Intent intent =new Intent(MainActivity.this,SecondActivity.class);
Intent intent=new Intent("com.example.intent.ACTION_START");//你的具體要求
startActivity(intent);
}
});
然後,你驚奇地發現你的action(外貌)要求與我們最開始寫的信息居然完美符合,那恭喜你們配對成功。那可能有人覺得很奇怪,明明只有外貌符合要求,三觀(Category)要求都沒寫,這也能配對?然後細心的你會發現,我們給女方(目標Activity)添加信息時,Category一欄寫的是DEFAULT,這個單詞是默認的意思,說白點,就是說如果你對她沒有特殊的三觀要求,她就沒有意見,這是嫁雞隨雞嫁狗隨狗的女方,你還要求啥三觀呢?
當然如果你對三觀有着執着的要求,你大可以在你的要求欄下再添加一行代碼比如
intent.addCategory(com,exampel.activity.MY_CATEGORY);
這樣的結果就是你可能找不到對象,除非你在女方下也添加相應的信息。
隱式intent打開網頁
本來講完了上述內容我的文章已經寫完了,但是,多寫點也無妨,因爲隱式intent的用法更加廣泛,他能與其他程序互通,也能打開網頁。
button1.setOnClickListener(new View.OnClickListener() {//顯示intent
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http:www.baidu.com"));//上述兩行爲你相親的要求
startActivity(intent);
}
});
效果圖如下
爲了更好掌握這點代碼的原理,你可以將網頁也理解成一個Activity,不同的是,網頁的intent-fliter中的action信息爲“Intent.ACTION_VIEW”常量,而且在intent-fliter裏還配置了另一個信息data,data信息中又包含了sheme(數據協議),host(主機名)等信息。而上述代碼
intent.setData(Uri.parse("http:www.baidu.com"));
就是對響應信息的要求。
利用intent傳遞數據
傳遞數據分爲兩種,向下一個Activity傳遞數據,和將數據返回給上一個Activity.
向下一個Activity傳遞數據
我們以傳遞一個字符串爲例,咱們要幹什麼事呢
第一步,將字符串存到一個字符串字符串對象中
第二步:利用顯示intent跳轉到目的Activity
第三步:給字符串對象找一個鍵值並傳入intent中,
第四步:在目的Activity中獲取intent
第五步:獲取intent中的鍵值
第六步:取出鍵值對應的字符串並打印出來
具體的代碼實現
具體實現如下
在當前Acivity中
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="hi";//第一步
Intent intent =new Intent(MainActivity.this,SecondActivity.class);//第二步
intent.putExtra("E",data);//第三步
startActivity(intent);
}
});
在目標Activity中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent=getIntent();//第五步
String data=intent.getStringExtra("E");
Log.d("SecondActivity",data);//第六步
}
這樣是不是很好理解?而其中接觸的新函數putExtra()與intent.getStringExtra()的用法也顯而易見了。至於爲什麼要通過鍵值來傳遞數據,我怎麼知道,它的參數就是這麼給的(來自菜鳥的吐槽)
打印出來的日誌如下
將數據返回給上一個活動
intent是啓動Activity時傳遞數據的,那麼如果銷燬一個Activity時,如何向上一個Activity傳遞數據呢。
答案是使用Activity裏兩個自帶的函數startActivityForResult()與onActivityResult(),第一個函數是啓動另一個Activty的函數並要求一個返回值,而這個返回值就是通過onActivityResult()返回的。
實現效果:A啓動B,B銷燬並返回一個字符串
具體的實現步驟如下
第一步:利用startActivityForResult()A啓動B
第二步:在B裏,將字符串賦予鍵值,並放進intent
第三步:調用SetResult()返回intent
第四步:銷燬B
第五步:在A裏重寫onActivityResult(),因爲我們需要把傳過來的字符打印出來,讓你看到你傳遞成功了
具體代碼如下
A中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=(Button)findViewById(R.id.bu01);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);//第一步,第二個參數是請求碼
}
});
}
A中第五步
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)//第一個參數式啓動活動時傳入的請求碼,只有請求碼配對,才能往下執行。第二個參數是返回數據時的處理結果,第三個參數是data
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnedData =data.getStringExtra("data_return");
Log.d("MainActivity",returnedData);
}
break;
default:
}
}
B中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.bu1);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "hello");//第二步
setResult(RESULT_OK, intent);//第三步。第一個參數是返回結果
finish();第四步
}
});
}
值得注意的是,我在實現的過程中發現當按下B中的按鈕,finish()執行了但並不會直接銷燬B,還需要再按一下按鈕才能銷燬並返回intent。(具體的解決方法我也不是很清楚。)
運行之後我們可以在日誌中看到