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等 属性,详细请使用搜索引擎。