Intent的詳細分析

Intent全部功能與詳細解析:

Intent分爲顯示Intent和隱式Intent:


一、顯示Intent的應用之——兩個activity的跳轉:

下面爲大家首先介紹一下顯示Intent:顯示的Intent故名思意,動作方式比較明顯,所以我們稱它爲顯示Intent,它可以幫住我們實現兩個活動之間的跳轉,Intent有許多的構造函數的重載,其中Intent(Context packageContext,Class<?>cls),Intent的這個構造函數中一共共有兩個參數,故名思意,這裏面的第一個參數我們提供給它一個上下文即我們現在正在啓動的activity,裏面的第二個參數是我們想要啓動的activity的名字,這樣我們的intent的對象也就建立成功了,然後我們可以好好的使用這個Intent了,在Activity中有着這樣一個方法:startActivity的這樣一個方法,這個方法是專門用於啓動活動的方法,只需要把我們剛纔構造好的intent的參數傳進去,就可以實現我們的啓動目標活動了。代碼如下:

public class Second extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        Button button =new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(Second.this,MainActivity.class);
                startActivity(intent);

            }
        });


    }
}
這樣我們就能夠實現從當前Acitivtiy中跳轉到另外一個Activity,當然這也只是我們顯示Intent的其中的一個功能。





顯示Intent的應用之——利用intent傳值:

利用intent傳遞數據,intent能夠把我們當前界面的數據傳遞給下一個界面,數據傳遞的思路非常的簡單,intent中提供給我們putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中,啓動了另外一個活動後,只需要我們再把這些數據從Intent中取出來就可以了。比如說我們要想把Second中的數據傳遞到MainActivity中我們只需要這樣寫:

public class Second extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                String data = "hello world";
                Intent intent = new Intent(Second.this, MainActivity.class);
                intent.putExtra("word", data);
                startActivity(intent);


            }
        });


    }
}

這樣我們便把我們的值傳到了第二個Activity之中,在我們的putExtra()的方法中有兩個參數,我們把他們成爲鍵值對,第一個參數是鍵,第二個參數是我們值,當我在MainAcitivity中想要接受傳進來的數據的時候,我們還是要用到Intent,當我們想在我們的MainActivity中打印我們的值的時候我們應該這樣寫:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestWindowFeature(getWindow().FEATURE_NO_TITLE);

        Intent intent=getIntent();
        String[] data=intent.getStringArrayExtra("word");
        Log.d("lin_sir", ---lin--->String.valueOf(data));

    }


}

在這個方法之中,我們首先調用getIntent()的方法獲取到用於啓動SecondActivity的Intent,然後調用我們的getSringArrayExtra的方法,然後將我們剛纔的鍵的值穿進去,這樣我們就可以獲取到我們的數據了。


顯示Intent的應用之——利用intent返回數據給上一個活動:

既然我們intent可以將數據傳給下一個acitivity,那麼我們推測它也可以給我們上一個acitivity返回數據,想要給上一個activity返回數據也就是說當我們點擊back的時候,數據就給上一個界面返回了。當我們一個activity在銷燬的時候如果我們想返回一個結果給上一個界面的時候那我們遍要用到startActivity
ForResult()的這個方法。



下面我爲大家看一下我的代碼:

FirstActivity:


public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestWindowFeature(getWindow().FEATURE_NO_TITLE);

        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

                startActivityForResult(intent, 1);
                //這裏面的1是我們的請求碼,請求嗎只要是一個唯一的值就可以
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {

            case 1:
                if (resultCode == RESULT_OK) {
                    String returenedData = data.getStringExtra("data_return");
                    Log.d("FirstActivity", returenedData);

                }
                break;
            default:

        }

    }

}




SecondActivity:

public class SecondActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button button2 = new Button(this);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                Intent intent = new Intent();
                intent.putExtra("data_return", "Hello Acitivity");

                setResult(RESULT_OK, intent);
                //RESULT_OK只是一個參數,把我們的返回值給帶回去

                finish();
            }
        });

    }
    
}




我們在FirstActivity中先用到了startActivityForResult()的方法來啓動我們的SecondActivity,在這裏我們傳入了一個請求碼,這裏我們這個代碼就讓它爲1,然後我們在我們的Second裏面利用Intent來傳遞數據,我們把我們的數據放在了我們的Intent裏面,然後我們又調用了setResult()的方法接受我們的兩個參數,在我們的setResult()的方法裏面一共收到了兩個參數,一個餐數據RESULT_OK,這只是一個參數,我們也可以用RESULT_CANCELED,第二參數則是攜帶我們數據的Intent傳回去,然後我們再調用finish()的方法銷燬我們當前的活動。

在我們的FirstActivity中使用的是startActivityForResult()的方法來啓動的我們的第二個Activity,所以在SecondActivity被銷燬的時候會回調上一個活動的onActivityResult()方法,因此我們需要在FirstActivity中重寫這個方法來得到返回的數據,在onActivityResult()的方法中共有三個參數,分別是,requestCode,resultCode,data,這三個參數分別是,請求碼,還有我們的一個攜帶數據的參數,也就是RESULT_OK,第三個參數則是我們的數據,所以我們可以在我們重寫的方法中利用我們的鍵值來得到我們想要的數據。



以上我們的顯示Intent便可以告一段落了,下面由我爲大家介紹一下隱式的Intent:


二、隱式Intent

隱式Intent之界面跳轉:

故名思意嘛,隱式也就是說,相比於顯示Intent,隱式的Intent就更爲隱蔽更爲收斂含蓄了許多,它並不會明確的指出我們要啓動哪一個活動,而是指定了一系列更爲抽象的action和category等信息,然後把這個值交給我們的系統去分析我們的這個Intent然後找出相應合適的活動去啓動。
系統會根據什麼條件去查找呢,當然是在我們的AndroidManifest文件下面的<activity>標籤下配置的<intent-filter>的內容,就可以指定我們的action和category,代碼如下:


<activity
    android:name=".FirstActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

在這裏面我們便設置了我們的action,和我們的category,在這裏也要強調一句,這兩個值也是系統給我們的,當滿族這兩個值的時候也會是我們系統的默認的首先啓動的Activity。


然後我們便可以在我們的activity中設置我們的事件了:


public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestWindowFeature(getWindow().FEATURE_NO_TITLE);

        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent("android.intent.action.MAIN");
                startActivity(intent);
            }
        });

    }


}

可能有人會好奇了,爲什麼在這裏我們僅僅制訂了一個<action>,並有制定我們的<category>,這是因爲在我們的系統調用startActivity的時候會默認的爲我們調用一個默認的<category>即android.intent.category.DEFAULT,所以一個默認的<category>就會被調用到Intent當中了。通過運行程序我們就會發現我們跳入了<action>的值爲我們設定的activity了。

下面我們要強掉一下的就是,我們的一個隱式的Activity的啓動的方式裏面,只能夠擁有一個<action>但是可以同時用擁有多個<category>例如:
public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestWindowFeature(getWindow().FEATURE_NO_TITLE);

        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent("android.intent.action.MAIN");
                intent.addCategory("wo_shi_di_yi_ge_category");
                intent.addCategory("wo_shi_di_er_ge_category");
                startActivity(intent);
            }
        });

    }


}

到這裏我們通過隱式Intent啓動一個新的activity的介紹就結束了。


隱式Intnet的更多的用法:

在剛剛的介紹中我們僅僅介紹到了,利用隱式intent來啓動我們的另外的一個activity,實際上隱式的intent還可以做更多的事情。當我們使用隱式intent的時候我們還可以調用一些,並不是我們程序內部的活動,這便使得我們安卓多個程序之間的功能的共享成爲了可能,例如:當我們的app裏面的功能需要調用到一個瀏覽器的時候,我們不可能事先寫好了一個瀏覽器然後嵌套進入我們的app,那麼我能便可以通過隱式的intent調用系統的瀏覽器,當然intent還可以調用很多很多的東西,例如想調用系統的撥號權限,或者系統發短信的權限等等。

下面爲大家介紹一下如何調用系統的瀏覽器:

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestWindowFeature(getWindow().FEATURE_NO_TITLE);

        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });

    }


}

這樣我們便可以調用我們的系統的瀏覽器啦。我們在剛纔的代碼用涉及到了一個setData()的方法,是用於指定我們接受的是一個Uri的對象,用於我們當前的Intent操作的數據,這些數據當然就是以字符串的形式傳入到Uri.parse()的方法中解析產生的。

其實我們也可以在我們的<intent-filter>中再配置一個<data>的標籤,用於更加精準的指出我們想讓當前活動響應什麼樣的類型的數據,<data>標籤還可以添加一下的配置內容:


1.android:scheme
用於指定數據的協議部分,如上例中的http部分。

2.android:host
用於指定數據的主機名部分,樹上裏中的www.baidu.com部分。

3.android:port
用於指定數據的端口部分,一般緊隨在主機名之後。

4.android:path
用於指定主機名和端口之後的部分,如一段王志忠跟在域名之後的部分。

5.android:mimeType
用於指定可以處理的數據類型,允許使用通配符的方式進行制定。


注:我們並不建議在我們的<date>標籤中使用過多的內容,因爲只有在Intent的Data和<data>標籤中的內容完全一致時,程序才能夠響應當前的Intent。






以上便是我對Intent的所有內容進行的一個總結。



































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