04_显示意图打开activity
实际上用显式意图打开一个activity就很简单了。只需要指定你要打开的这个activity的class就可以了。
需要注意一点的是创建了一个ThirdActivity必须要在清单文件里面声明。如果没在清单文件里面声明ThirdActivity的效果是这样的:
程序挂掉会有一个友好的提示:FATAL EXCEPTION:main
以后再看到这一个报错,就表明你要开启的这个activity并没有在清单文件里面声明。所以咱们一定要声明它。
由于不需要通过隐式意图开启ThirdActivity,所以说只需要在清单文件里面声明一个name就可以了。
<activity android:name="com.itheima.callnewactivity.ThirdActivity"> </activity>
程序运行成功了:
这个就是显式意图。显式意图在intent里面直接指定了我要开启哪一个activity。所以说这个就是显式的。隐式呢?实际通过这段XML
<intent-filter > <action android:name="com.itheima.second2"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="itheima" android:mimeType="itcast/itheima" /> </intent-filter>
你不去翻对应的代码究竟打开谁只通过intent-filter匹配的这些数据你是不知道究竟要开启谁。你只有翻了对应的activity或者运行之后你才知道这个东西究竟要开启的是哪一个。所以说这个是隐式的。
但是显式的在这里已经写的很清楚了,我要开启的是ThirdActivity.
public void openThird(View v){ /* Intent intent = new Intent(); //给意图设置一个动作 intent.setAction(Intent.ACTION_CALL); //给意图设置数据 intent.setData(Uri.parse("tel:"+110)); //打开打电话的activity startActivity(intent);*/ Intent intent = new Intent(getApplicationContext(), ThirdActivity.class);//传两个参数 第一个是上下文 第二个是class //class,打开哪一个activity就把它对应的class传进来. startActivity(intent); }
而且如果你开启是用隐式意图,我当前的应用可能有好几个activity都配置了相同的intent-filter.这个在咱们使用手机的时候经常会出现这个情况。比如咱们下载一个软件突然间弹出来有人给你选,比如你手机装了三四个浏览器,有的时候你下载的时候它默认向用户浏览器打开这个链接,那你手机装了不止一个浏览器的时候它突然间会弹出一个界面,让你选用哪一个打开。这是因为我当前手机多个activity配置了相同的意图过滤器。这个时候它不可能把所有的activity都给你打开,让你选一选。
<intent-filter > <action android:name="com.itheima.second"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="itheima"/> </intent-filter>
所以说用隐式意图,就可能出现让你选的这个情况。但是使用显式意图就肯定不能了。你指定了要打开的这个具体的activity的名字,不可能在一个手机里面装了两个包名和类名都一样的activity。所以说显式意图和隐式意图它们俩还是有些区别的。
还有呢用这种方式
<activity android:name="com.itheima.callnewactivity.ThirdActivity"> </activity>
指定一个类名的方式打开一个activity,它只能打开当前应用的。
public void openThird(View v){ /* Intent intent = new Intent(); //给意图设置一个动作 intent.setAction(Intent.ACTION_CALL); //给意图设置数据 intent.setData(Uri.parse("tel:"+110)); //打开打电话的activity startActivity(intent);*/ Intent intent = new Intent(getApplicationContext(), ThirdActivity.class);//传两个参数 第一个是上下文 第二个是class //class,打开哪一个activity就把它对应的class传进来. startActivity(intent); }
因为在这里要访问这一份字节码,别人用了ThirdActivity.class,我在现在这个代码里面是访问不到的。通过这种方式只能够打开自己应用的activity。用显式意图能不能开别人应用的activity?
public void openThird(View v){ /* Intent intent = new Intent(); //给意图设置一个动作 intent.setAction(Intent.ACTION_CALL); //给意图设置数据 intent.setData(Uri.parse("tel:"+110)); //打开打电话的activity startActivity(intent);*/ //Intent intent = new Intent(getApplicationContext(), ThirdActivity.class);//传两个参数 第一个是上下文 第二个是class //class,打开哪一个activity就把它对应的class传进来. Intent intent2 = new Intent(); intent2.setClassName("com.itheima.createnewactivity", "com.itheima.createnewactivity.MainActivity");//通过这种方式可以打开其他应用的activity.第一个参数是应用的包名,第二个参数是全类名. //startActivity(intent); startActivity(intent2); }
通过显式意图不但可以开启自己应用的也可以开启别其他应用的,但是前提是你得知道别人应用的包名和你要打开的这一个类的全类名。
一般自己开自己应用的activity是用显式意图。打开自己应用的就没必要非得搞这么麻烦了。只需要通过一个显式意图。如果是想让别人开启你的应用的activity,那就使用隐式意图。很少会用显式意图把应用的包名和activity的全路径都告诉别人。一般都是设置intent-filter然后通过匹配intent-filter的方式来让别人开启你当前的应用对应的activity。
package com.itheima.callnewactivity; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); setContentView(R.layout.activity_second); } public void openThird(View v){ /* Intent intent = new Intent(); //给意图设置一个动作 intent.setAction(Intent.ACTION_CALL); //给意图设置数据 intent.setData(Uri.parse("tel:"+110)); //打开打电话的activity startActivity(intent);*/ //Intent intent = new Intent(getApplicationContext(), ThirdActivity.class);//传两个参数 第一个是上下文 第二个是class //class,打开哪一个activity就把它对应的class传进来. Intent intent2 = new Intent(); intent2.setClassName("com.itheima.createnewactivity", "com.itheima.createnewactivity.MainActivity");//通过这种方式可以打开其他应用的activity.第一个参数是应用的包名,第二个参数是全类名. //startActivity(intent); startActivity(intent2); } }
package com.itheima.callnewactivity; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; public class ThirdActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); setContentView(R.layout.activity_third); } public void call(View v){ Intent intent = new Intent(); //给意图设置一个动作 intent.setAction(Intent.ACTION_CALL); //给意图设置数据 intent.setData(Uri.parse("tel:"+110)); //打开打电话的activity startActivity(intent); } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="openThird" android:text="打开第三个Activity" /> <TextView android:layout_below="@id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#00ff00" android:textSize="20sp" android:text="第二个activity" /> </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="call" android:text="打电话" /> <TextView android:layout_below="@id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#00ff00" android:textSize="20sp" android:text="第三个activity" /> </RelativeLayout>