显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。即组件的包名、组件名、组件的class。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
显示意图非常常用也非常简单一般用于应用程序内之间Activity的相互调用转换,就不多说了,这里我介绍一下隐式意图:
简单概括就是: 意图包括:Action(动作),Category(附加信息),Data(数据,具体内容),Tpye(类型)等等,举个例子,说白了意图就是启动一个组件的的完整的动作信息,就像打人,打就是Action动作,人就是Data内容,而Type就是类型,打什么人呢?打坏人,type就是坏指的类型,只有这些信息全了才能执行一个完整的意图,当然还有一些信息,比如scheme就是URI类型的数据的前缀,就像这个例子当中的sms:,还有host主机名,path路径等。
显示调用系统的intent的例子
package com.example.testnetconnect;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//测试系统的网络是否连接
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if(info!=null&&info.isConnected()){
Toast.makeText(this, "网络是连接的", 1).show();
}else{
Toast.makeText(this, "网络没有连接", 1).show();
Intent intent = new Intent();
//设置包名,和类名cmp=com.android.settings/.SubSettings
intent.setClassName("com.android.settings", "com.android.settings.SubSettings");
startActivity(intent);
}
}
}
隐式调用系统浏览器的例子:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view){
Intent intent = new Intent();
//隐士意图:定义操作的行为,找一个最适合的对象来执行
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
}
显示意图和隐式意图的应用场景:
显示意图:同一个应用程序自己激活自己的东西,推荐使用显示意图。
隐式意图:不用应用程序中,激活别人的应用或者自己的应用被别人激活,使用隐式意图。例如查询系统所有的activy是不是满足的条件的activy。
如果有判断多少个,1个直接启动,如果有多个,列表的方式
如果没有应用程序异常终止。