启动界面的两种方式
- 显式意图
写法上简单多了,只要指定上下文,和具体的类就可以跳转
能够直接知道跳转的界面
注册:
<activity android:name="com.itheima.start.Activity01"></activity>
跳转:
Intent intent = new Intent(this , Activity01.class);
startActivity(intent);
作用: 一般是启动自己程序的界面,其他程序的界面通过这种方式无法启动
如果使用了显式手法注册,还想被其他应用程序打开, 那么可以在activity标签里面,加上
android:exported="true"
- 隐式意图
写法上稍稍复杂,要指定action 和 data
看不出来跳转的界面,只有运行后才知道
注册:
<activity android:name="com.itheima.start.Activity02">
<!-- 意图过滤器, 只要满足了action , 和 category .,那么久启动这个界面 -->
<intent-filter >
<action android:name="com.itheima.start.action.OPEN02"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
跳转:
Intent intent = new Intent();
intent.setAction("com.itheima.start.action.OPEN02");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
作用: 跳转其他的应用程序界面,或者是自己的应用程序界面想被其他的程序打开
详细参数:
action: 动作
category 分类
data: 指定数据, 一般关注两个:scheme 和 mimetype
android:scheme="itheima" android:path="www.itheima" android:mimeType="text/plain"
举个例子:需求:在一个程序里面,使用显示和隐式跳转
我们把下面这个应用叫做04应用,包名是com.itheima.start
MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//显式启动
public void click01(View v){
Intent intent = new Intent(this , Activity01.class);
startActivity(intent);
}
//隐式启动
public void click02(View v){
Intent intent = new Intent();
intent.setAction("com.itheima.start.action.OPEN02");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
}
}
Activity01
public class Activity01 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity01);
}
}
Activity02
public class Activity02 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity02);
}
}
AndroidManifest.xml
<!--这里是设置了显示跳转,如果这个activity还想让其他的应用程序打开,那么这个activity在注册的时候,必须要设置android:exported="true"-->
<activity android:name="com.itheima.start.Activity01" android:exported="true"></activity>
<!--只要满足意图过滤,外部的应用程序,也是可以跳转到这个activity的--->
//跳转隐式意图,必须设置意图过滤
<activity android:name="com.itheima.start.Activity02">
<!-- 意图过滤器, 只要满足了action , 和 category .,那么久启动这个界面 -->
<intent-filter >
<action android:name="com.itheima.start.action.OPEN02"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
现在举一个外部程序,打开A应用的程序的例子
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//显式意图启动04应用01界面
public void click01(View v){
//Intent intent = new Intent(this ,Activity01.class);
Intent intent = new Intent();
intent.setClassName("com.itheima.start", "com.itheima.start.Activity01");
//使用setCalssName方法设置,
//参数1:应用程序的包名
//参数2:Activity01在注册清单文件的设置的值
startActivity(intent);
}
//隐式意图启动04应用02界面
public void click02(View v){
Intent intent = new Intent();
//需要满足意图过滤器
intent.setAction("com.itheima.start.action.OPEN02");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
}
}
细节:
<activity android:name="com.itheima.start.Activity02">
<intent-filter >
<!-- 动作: 自己指定,一般都是包名.action名称的形式 -->
<action android:name="com.itheima.start.action.OPEN02"/>
<!-- 分类: default -->
<category android:name="android.intent.category.DEFAULT"/>
<!-- http://www.baidu.com -->
<data android:scheme="itheima" android:path="www.itheima" android:mimeType="text/plain"/>
</intent-filter>
</activity>
注意的是:在设置data这个过滤的时候,必须要小心设置
Intent intent = new Intent();
intent.setAction("com.itheima.start.action.OPEN02");
intent.addCategory("android.intent.category.DEFAULT");
/*
//在设置scheme和mimeType的时候,需要使用下面这个方法
//因为
//intent.setType(type);
//intent.setData(Uri.parse());
//这2个方法是会互斥的,他们后设置的,会把前面的那个给清楚调,所以使用下面那个方法,一起设置了
*/
intent.setDataAndType(Uri.parse("itheima://itheima.com2"), "text/plain");