Android中Activity的跳转,通过Intent来实现,其中又分为显式和隐式。


显式跳转

在AndroidManifest.xml注册跳转所需要的两个Activity,如:


<activity android:name=".FirstActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".SecondActivity">
</activity>

上面一段代码对FirstActivity和SecondActivity在AndroidManifest.xml中进行注册

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

表示此Activity为主Activity,作为应用程序启动时启动的Activity,SecondActivity只是简单的进行注册

在FirstActivity中:


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

new一个Intent对象,设置从FirstActivity跳转到SecondActivity,startActivity启动跳转。


隐式跳转

在AndroidManifest.xml注册跳转所需要的两个Activity,如:


<activity android:name=".FirstActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="android.intent.action.SecondActivity"></action>          <category android:name="android.intent.category.DEFAULT"></category>        <category android:name="android.intent.category.SecondActivity"></category>    </intent-filter></activity>

这段代码中,在SecondActivity中添加了一个action和两个category,隐式跳转时,跳转intent需要设置action和category,当这两个同时匹配时,跳转到这个Activity。一个Activity只能有一个action,但是可以有多个category,action和category是可以自定义的。

在FirstActivity中:


Intent intent = new Intent();
intent.setAction("android.intent.action.SecondActivity");
intent.addCategory("android.intent.category.SecondActivity");
startActivity(intent);

这段代码中并没有指定跳转到SecondActivity,但是SecondActivity在AndroidManifest.xml注册的action和category与这个相匹配,所以跳转到SecondActivity。



Intent intent = new Intent();
intent.setAction("android.intent.action.SecondActivity");
startActivity(intent);

在这段代码中,intent去掉了category的设置,也可以跳转到SecondActivity,因为在注册SecondActivity的时候,我们注册了额两个category, <category android:name="android.intent.category.DEFAULT"></category>代表默认的category。intent不设置category表示intent设置category为默认,只要Activity注册了

<category android:name="android.intent.category.DEFAULT"></category>即可匹配。


Intent传值

从FirstActivity传值到SecondActivity,intent有一个方法intent.putExtra("key", "String");在FristActivity中:


Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.putExtra("key", "String");
startActivity(intent);

然后在SecondActivity中:


Intent intent = getIntent();
String data = intent.getStringExtra("key");

这时候输出data,data中的值即为String,putExtra可以传int、float、boolean等各种值,对应取值为getIntExtra、

getFloatExtra、 getBooleanExtra等


Intent回传值

当我们在SecondActivity中完成操作时,回到FirstActivity中需要回传值,把FirstActivity中启动intent的startActivity(intent)换为startActivityForResult(intent, requestCode)其中requestCode为int类型,为你自己定义的数字,后面回传时我们需要用到。

同时在FirstActivity中重写方法onActivityResult:


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode)
    {
        case this.requestCode:
            if (resultCode == RESULT_OK) {
                String return_data = data.getStringExtra("return");
            }
            break;
        default:
    }
}

在SecondActivity中,调用如下代码返回FirstActivity


Intent intent = new Intent();
intent.putExtra("return", "String");
setResult(RESULT_OK, intent);
finish();

调用这段代码后,SecondActivity销毁,RESULT_OK为父类的int类型,为-1。不想用

RESULT_OK可以自定义int,同时FirstActivity中的RESULT_OK应该与你自定义的int值相同。此时,FirstActivity中的return_data即为SecondActivity传的值String。


隐式Intent打开浏览器等其他应用

在跳转时,添加这一行intent.setData(Uri.parse("http://cn.bing.com"));则会自动匹配action和category相同的具有浏览器功能的应用,如果没有则报错。

在自己的Actvity中注册浏览器,需要在AndroidManifest.xml中自己Activity中的<intent-filter>下添加<data android:scheme="http"></data>其中http表示网页,还有其他的tel表示拨号程序等,data标签下还有android:host等 属性,详细请使用搜索引擎。