使用隐式的Intent
含蓄,不指名道姓,不会指明那个Activity必须被哪个Activity所启动。
一个Activity2如何被另一个Activity1所启动,关键取决于AndroidManifest.xml中对于Activity2定义的两个标签的信息,分别是action和category。
1 <activity android:name=".SecondActivity"> 2 <intent-filter> 3 <action android:name="android.bignerdranch.activitytest.ACTION_START" /> 4 <category android:name="android.intent.category.DEFAULT" /> 5 </intent-filter> 6 </activity>
然后使用另一个的构造函数Intent(String str)来创建隐式的Intent:
1 button1.setOnClickListener(new View.OnClickListener(){ 2 @Override 3 public void onClick(View v) { 4 Intent intent = new Intent("android.bignerdranch.activitytest.ACTION_START"); 5 startActivity(intent); 6 } 7 });
以上代码创建的Intent对象,用它启动Activity,启动的是能够响应"android.bignerdranch.activitytest.ACTION_START"这个action的活动,由于SecondActivity的category指定为默认,因此是可以匹配的,可以成功启动SecondActivity。
【注意】:每个Intent只能指定一个action,但却能指定多个category。
如果intent对象中多指定一个category,那么,这个intent就无法启动SecondActivity了:
1 button1.setOnClickListener(new View.OnClickListener(){ 2 @Override 3 public void onClick(View v) { 4 Intent intent = new Intent("android.bignerdranch.activitytest.ACTION_START"); 5 intent.addCategory("android.bignerdranch.activitytest.MY_CATEGORY"); 6 startActivity(intent); 7 } 8 });
这样一来,使用startActivity(intent)启动一个Activity,没有一个Activity与它匹配,程序就会闪退。
出现运行时异常:android.content.ActivityNotFoundException:No Activity found to handle Intent
解决异常:在安卓总配置文件的<intent-filter>标签中再添加一个category声明:
1 <activity android:name=".SecondActivity"> 2 3 <intent-filter> 4 5 <action android:name="android.bignerdranch.activitytest.ACTION_START" /> 6 7 <category android:name="android.intent.category.DEFAULT" /> 8 9 <category android:name="android.bignerdranch.activitytest.MY_CATEGORY" /> 10 11 </intent-filter> 12 13 </activity>
隐式Activity隐式的Activity正如名字一样,一些信息是隐秘的,我们来看看AndroidManifest.xml这个配置文件,它是用于捆绑Activity和视图的配置文件,就像jsp servlet一样。1、我们来看下他的配置
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.intent" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".BMainActivity" android:label="@string/title_activity_bmain" >
<intent-filter > <category android:name="android.intent.category.DEFAULT"/> <action android:name="com.example.intent.BMainActivity" /> </intent-filter>
</activity> </application>
</manifest>1234567891011121314151617181920212223242526272829303132333435363738注意看 30 和 31行,是我新加的两行代码
<intent-filter > <category android:name="android.intent.category.DEFAULT"/> <action android:name="com.example.intent.BMainActivity" /></intent-filter>1234category android:name=”android.intent.category.DEFAULT”指定Intent跳转的方式为默认,默认为Activity间的跳转。action android:name=”com.example.intent.BMainActivity”,指定Activity的名字(别名)
2、我们来看看代码是怎么样隐式表达的。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { // TODO Auto-generated method stub startActivity(new Intent("com.example.intent.BMainActivity")); } }); }12345678910111213new Intent(“com.example.intent.BMainActivity”),直接用在AndroidManifest.xml定义的别名来进行activity之间的跳转。
3、这么用有个优点,就是可以跨应用跳转,就是我可以从一个baidu应用,跳转到一个QQ音乐应用的Activity里,瞬间感觉这个隐式Intent不错吧。我们经常在应用中见到。所以有一点指的我们注意,那就是配置文件中,别名的命名规则,采取应用包名+activity名保证唯一。
4、如果我们不想对其他应用开放某个activity,那么通过配置接口实现。activity配置中增加android:exported=”false”,默认为true。
<activity android:name=".BMainActivity" android:label="@string/title_activity_bmain" android:exported="false" >
<intent-filter > <category android:name="android.intent.category.DEFAULT"/> <action android:name="com.example.intent.BMainActivity" /> </intent-filter>
</activity>————————————————版权声明:本文为CSDN博主「GP0071」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/gaopeng0071/article/details/45077203