以实际demo为例,演示Intent信息传递方法的显\隐示启动。
1.新建SecondActivity
在MainActivity的基础上,com.example.myapplication下新建一个SecondActivity,并设计其布局:
2.定义两个Activity
首先,确保在 AndroidManifest.xml 文件中定义了两个Activity。例如,MainActivity 和 SecondActivity,设定前者为默认启动:
3.在 MainActivity 中启动 SecondActivity
MainActivity中设计了Button元素,在主活动类中,设计点击操作调用SecondActivity。
(1)Intent显示启动
由于不同组件之间的交互,这里采用了Intent的显示启动(应用内部、应用之间的信息传递):
(2)Intent隐式启动
相对的,隐式启动间接通过AndroidManifest.xml中设置的Intent的action、category、data等属性来筛选启动的目标Activity:
<!-- <intent-filter> 定义LAUNCHER启动和MAIN主要Activity(常规有且只有一个) -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- <intent-filter> 自定义action的操作 -->
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.myapplication.secondaction" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
设置好后在主活动类中调用:
NOTING:隐式Intent启动其他应用的Activity时,需要确保目标应用已经安装在设备上,并且有一个Activity能够响应这个Intent,否则,startActivity()方法将不会启动任何Activity,并可能返回一个ActivityNotFoundException异常。为了避免上述情况,可以使用resolveActivity()方法或queryIntentActivity()方法来检查是否有能够响应这个Intent的Activity。
//创建一个Intent,假设我们想要打开浏览器
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
//使用resolveActivity()方法来检查是否有Activity能够处理该Intent
PackageManager packageManager = getPackageManager();
if (intent.resolveActivity(packageManager) != null){
//有Activity可以处理该Intent
startActivity(intent);
}else{
//没有Activity可以处理该Intent
Toast.makeText(this, "No application can handle this requeest",Toast.LENGTH_LONG).show
}
//使用queryIntentActivities()方法来获取所有能够处理该IntentActivity
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.querylIntentActivities(intent, 0);
if (activities.size() > 0) {
//有Activity可以处理该Intent
for (ResolveInfo resolveInfo : activities) {
//打印每个Activity的信息
String activityName = resolveInfo.activityInfoname;
String packageName = resolveInfo.activityInfo.packageName
Log.d("Available Activity", "Activity: " + activityName + ", Package:" + packageN
}
//启动第一个找到的Activity
startActivity(intent);
} else {
//没有Activity可以处理该Intent
Toast.makeText(this, "No application can handle thisrequest", Toast.LENGTH_LONG).show
}