intent使用

Android中的Intent

顯式intent

使用Intentintent(Contect packageContext,Class<?> cls)構造器構建一個intent,第一個參數Context   要求提供一個啓動活動的上下文,可以是當前activity,第二個參數class則是要指定要啓動的目標活動,構建好intent後將intent傳入Activity類提供的startActivity()方法就可以啓動目標活動。

案例:(忽略activitybutton以及監聽事件的創建過程)

FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent =
new Intent(FirstActivity.this,SecondActivity.class);
            startActivity(intent);
        }
    });
}

SecondActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
second_layout);
}

點擊第一個activity中的button會跳轉到第二個activity

 

隱式intent

隱式intent不明確指出要啓動哪一個活動,而是指定一系列更抽象的actioncategory交由系統找到適合的activity去啓動。

secondactivity<activity>標籤下配置<intent-filter>可以指定當前activity能夠響應的actioncategory,在androidMainFest.xml中配置

<activity
   
android:name=".SecondActivity"
   
android:label="SecondActivity">
    <
intent-filter>
        <
action android:name="com.example.zhangwd.firstapplication.ACTION_START" />
        <
category android:name="android.intent.category.DEFAULT" />
    </
intent-filter>
</
activity>

action中指定了當前活動可以響應com.example.zhangwd.firstapplication.ACTION_START這個action<category>包含了一些附加信息,更精確地指明當前活動能響應的intent中還可能帶有的category。只有<action><category>內容能夠同時匹配上intent指定的actioncategory時這個活動才能響應該intent

修改FirstActivity中的代碼:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button) findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(View view) {
            Intent intent =
new Intent("com.example.zhangwd.firstapplication.ACTION_START");
           
//intent.addCategory("android.intent.category.DEFAULT")
            //android.intent.category.DEFAULT
是一種默認的category,在調用startActivity()方法時會自動將此category加上
           
startActivity(intent);
        }
    });
}
 

Intent啓動其他程序的活動:

修改FirstActivity的代碼:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent =
new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(
"http://www.baidu.com"));
            startActivity(intent);
        }
    });
}

這次指定的actionIntent.ACTION_VIEW ,是android內置的動作,常量值爲android.intent.action.VIEWsetData()方法用於指定當前intent正在操作的數據,此數據需要使用Uri.parse()將一個網址字符串解析成一個Uri對象。

與此對應,我們可以在<intent-filter><data>標籤,更準確地表示當前活動能夠響應什麼類型的數據。

android:scheme。用於指定數據的協議部分,如http

android:host。用於指定數據的主機名部分,如www.baidu.com

android:port。用於指定數據的端口部分。

android:path。用於指定主機名和端口之後的部分。

android:mimeType。用於指定可處理的數據類型,可使用通配符。

只有dataintent攜帶的data一致時才能響應該intent,一般<data>中不會指定過多。像瀏覽器的示例中只需指定scheme可以響應所有http協議的intent

如果我們再增加一個ThirdActivity,在androidMeanFest.xml中修改註冊信息:

<activity
   
android:name=".ThirdActivity"
   
android:label="ThirdActivity">
    <
intent-filter>
        <
action android:name="android.intent.action.VIEW" />
        <
category android:name="android.intent.category.DEFAULT" />
        <
data android:scheme="http"/>
    </
intent-filter>
</
activity>

在我們再點擊FirstActivitybut1時會彈出所有能響應此intent的程序(browserFirstApplication),選擇瀏覽器還會像之前一樣打開瀏覽器,選擇FirstAplication會打開ThiredActivity,但並不會加載網頁。所以真正項目中不要出現這種誤導用戶的行爲。

除了http協議還可以指定其他協議,如:geo表示地理位置,tel表示撥打電話(intent.setData(Uri.parse("tel:10086")))。

 

向下一個活動傳遞數據:

Intent中提供了一系列putExtra()方法的重載,可以將要傳遞的數據暫存到Intent中,啓動另一個activity後再將數據從intent中取出即可。

FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            String data =
"Hello World";
            Intent intent =
new Intent(FirstActivity.this,SecondActivity.class);
            intent.putExtra(
"extra_data",data);
            startActivity(intent);
        }
    });
}

SecondActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
second_layout);
    Intent intent = getIntent();
    String data = intent.getStringExtra(
"extra_data");
    Log.d(
"SecondActivity",data);
}

如果傳遞的是布爾類型數據可以使用getBoolenExtra();

 

返回數據給上一個activity

Activity中有一個startActivityForResult()方法也用於啓動活動,但這個方法期望在活動銷燬時返回一個結果給上一個活動。

StartActivityForResult()接收兩個參數,第一個參數還是intent第二個參數是請求碼,用於在之後的回調中判斷數據源的來源。

FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.
first_layout);
    Button btn = (Button)findViewById(R.id.
but1);
    btn.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent =
new Intent(FirstActivity.this,SecondActivity.class);
           startActivityForResult(intent,
1);
        }
    });
}

SecondActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    Button btn2 = (Button)findViewById(R.id.
button2);
    setContentView(R.layout.
second_layout);
    btn2.setOnClickListener(
new View.OnClickListener() {
       
@Override
       
public void onClick(Viewview) {
            Intent intent = getIntent();
            intent.putExtra(
"data_extra","helloworld");
            setResult(
RESULT_OK,intent);
            finish();
        }
    });
}

這裏創建的intent只用於傳遞數據,將要傳遞的數據保存發哦intent中後調用setResult()方法,這個方法接收兩個參數,第一個參數是用於向上一個參數返回處理結果,一般使用RESULT_OKRESULT_CANCELED這兩個值,第二個參數是intent,然後調用finish()銷燬當前activity

由於是使用startActivityForResult()方法啓動的SecondActivity,當這個activity銷燬時會調用上一個活動的onActivityResult()方法,我們需要在FirstActivity中重寫此方法來獲取數據。

@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data) {
   
switch (requestCode){
       
case 1:
           
if(RESULT_OK == resultCode){
                String returnData =data.getStringExtra(
"data_extra");
                Log.d(
"FirstActivity", returnData);
            }
           
break;
       
default:
    }
}

不增加按鈕,按下BACK按鈕也可以返回上一activity,只需要在SecondActivity中重寫onBackPressed()方法:

@Override
public void onBackPressed() {
    Intent intent = getIntent();
    intent.putExtra(
"data_extra","helloworld");
    setResult(
RESULT_OK,intent);
    finish();
}

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章