对于何为intent显性和隐性我一直傻傻分不清楚,近来看了相关的书籍后,感觉清晰了许多。
针对intent显性可以这样理解:例如我们去买一个东西,指明了这个东西的名字,那么就是显性的。那这个显性intent在Android Studio里面又是怎么展示的呢?主要有两种形式(方式一较方式二更加简洁):
//显式intent
//方式一:
Intent intent = new Intent(this,MainActivity2.class);
startActivity(intent);
//方式二:
ComponentName componentName = new ComponentName(this,MainActivity2.class);
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
那何为隐形intent呢?可以这样理解:例如我去买个东西,我没有直接指明这个东西的名字,而是用一些形容词去形容它,比如很大,很漂亮,很廋等,如果都满足的话,便是我要买的东西。那这个隐性intent在Android Studio里面又是怎么展示的呢?主要使用如下所示:
//隐式intent(跳转到MainActivity2)
//设置Action、Category属性
Intent intent = new Intent();
intent.setAction(MainActivity.TIAOZHUAN_ACTION);
startActivity(intent);
//设置Data属性(注意data与type属性是相互覆盖的)(跳转到MainActivity3)
Intent intent = new Intent();
intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/path"),"abc/xyz");
intent.setAction(MainActivity.TIAOZHUAN_ACTION);
startActivity(intent);
对于设置Action,Category属性,需要将跳转到的那个Activity在AndroidManifest进行声明(即MainActivity2):
<activity android:name=".MainActivity2"
android:exported="true">
<intent-filter>
<action android:name="com.example.intentapplication.intent.action.TIAOZHUAN_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
对于设置Data属性,需要将跳转到的那个Activity在AndroidManifest进行声明(即MainActivity3),这里需要注意的是Data和Type属性是相互覆盖的,如需要两者一起存在,需使用setDataAndType方法:
<activity android:name=".MainActivity3"
android:exported="true">
<intent-filter>
<action android:name="com.example.intentapplication.intent.action.TIAOZHUAN_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="abc/xyz"
android:scheme="lee"
android:host="www.fkjava.org"
android:port="8888"
android:path="/path"
/>
</intent-filter>
</activity>
到这里还需要指出的是一个Intent对象最多只能包括一个Action属性,但一个Intent对象可以包括多个Category属性。
将MainActivity2在AndroidManifest声明两个action:
<activity android:name=".MainActivity2"
android:exported="true">
<intent-filter>
<action android:name="com.example.intentapplication.intent.action.TIAOZHUAN_ACTION"/>
<action android:name="xmr.hello"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在Mainactivity里面进行跳转到MainActivity2:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_intent;
public static final String TIAOZHUAN_ACTION = "com.example.intentapplication.intent.action.TIAOZHUAN_ACTION";
public static final String TIAOZHUAN_ACTION_ONE = "xmr.hello";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initListener();
}
private void initListener() {
btn_intent.setOnClickListener(this);
}
private void init() {
btn_intent = findViewById(R.id.btn_intent);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_intent:
tiaozhuan();
break;
}
}
private void tiaozhuan() {
//隐式intent(跳转到MainActivity2)
//设置Action、Category属性
Intent intent = new Intent();
intent.setAction(MainActivity.TIAOZHUAN_ACTION);
/*intent.setAction(MainActivity.TIAOZHUAN_ACTION_ONE);*/
startActivity(intent);
}
}
经过实验后可以发现只要符合其中一个action的值便可以进行跳转。
成功跳转后的效果: