Intent全部功能与详细解析:
Intent分为显示Intent和隐式Intent:
一、显示Intent的应用之——两个activity的跳转:
下面为大家首先介绍一下显示Intent:显示的Intent故名思意,动作方式比较明显,所以我们称它为显示Intent,它可以帮住我们实现两个活动之间的跳转,Intent有许多的构造函数的重载,其中Intent(Context packageContext,Class>cls),Intent的这个构造函数中一共共有两个参数,故名思意,这里面的第一个参数我们提供给它一个上下文即我们现在正在启动的activity,里面的第二个参数是我们想要启动的activity的名字,这样我们的intent的对象也就建立成功了,然后我们可以好好的使用这个Intent了,在Activity中有着这样一个方法:startActivity的这样一个方法,这个方法是专门用于启动活动的方法,只需要把我们刚才构造好的intent的参数传进去,就可以实现我们的启动目标活动了。代码如下:
public class Second extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
Button button =new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Second.this,MainActivity.class);
startActivity(intent);
}
});
}
}
这样我们就能够实现从当前Acitivtiy中跳转到另外一个Activity,当然这也只是我们显示Intent的其中的一个功能。
显示Intent的应用之——利用intent传值:
利用intent传递数据,intent能够把我们当前界面的数据传递给下一个界面,数据传递的思路非常的简单,intent中提供给我们putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另外一个活动后,只需要我们再把这些数据从Intent中取出来就可以了。比如说我们要想把Second中的数据传递到MainActivity中我们只需要这样写:
public class Second extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "hello world";
Intent intent = new Intent(Second.this, MainActivity.class);
intent.putExtra("word", data);
startActivity(intent);
}
});
}
}
这样我们便把我们的值传到了第二个Activity之中,在我们的putExtra()的方法中有两个参数,我们把他们成为键值对,第一个参数是键,第二个参数是我们值,当我在MainAcitivity中想要接受传进来的数据的时候,我们还是要用到Intent,当我们想在我们的MainActivity中打印我们的值的时候我们应该这样写:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestWindowFeature(getWindow().FEATURE_NO_TITLE);
Intent intent=getIntent();
String[] data=intent.getStringArrayExtra("word");
Log.d("lin_sir", ---lin--->String.valueOf(data));
}
}
在这个方法之中,我们首先调用getIntent()的方法获取到用于启动SecondActivity的Intent,然后调用我们的getSringArrayExtra的方法,然后将我们刚才的键的值穿进去,这样我们就可以获取到我们的数据了。
显示Intent的应用之——利用intent返回数据给上一个活动:
既然我们intent可以将数据传给下一个acitivity,那么我们推测它也可以给我们上一个acitivity返回数据,想要给上一个activity返回数据也就是说当我们点击back的时候,数据就给上一个界面返回了。当我们一个activity在销毁的时候如果我们想返回一个结果给上一个界面的时候那我们遍要用到startActivity
ForResult()的这个方法。
下面我为大家看一下我的代码:
FirstActivity:
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestWindowFeature(getWindow().FEATURE_NO_TITLE);
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
//这里面的1是我们的请求码,请求吗只要是一个唯一的值就可以
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returenedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returenedData);
}
break;
default:
}
}
}
SecondActivity:
public class SecondActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button2 = new Button(this);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello Acitivity");
setResult(RESULT_OK, intent);
//RESULT_OK只是一个参数,把我们的返回值给带回去
finish();
}
});
}
}
我们在FirstActivity中先用到了startActivityForResult()的方法来启动我们的SecondActivity,在这里我们传入了一个请求码,这里我们这个代码就让它为1,然后我们在我们的Second里面利用Intent来传递数据,我们把我们的数据放在了我们的Intent里面,然后我们又调用了setResult()的方法接受我们的两个参数,在我们的setResult()的方法里面一共收到了两个参数,一个餐数据RESULT_OK,这只是一个参数,我们也可以用RESULT_CANCELED,第二参数则是携带我们数据的Intent传回去,然后我们再调用finish()的方法销毁我们当前的活动。
在我们的FirstActivity中使用的是startActivityForResult()的方法来启动的我们的第二个Activity,所以在SecondActivity被销毁的时候会回调上一个活动的onActivityResult()方法,因此我们需要在FirstActivity中重写这个方法来得到返回的数据,在onActivityResult()的方法中共有三个参数,分别是,requestCode,resultCode,data,这三个参数分别是,请求码,还有我们的一个携带数据的参数,也就是RESULT_OK,第三个参数则是我们的数据,所以我们可以在我们重写的方法中利用我们的键值来得到我们想要的数据。
以上我们的显示Intent便可以告一段落了,下面由我为大家介绍一下隐式的Intent:
二、隐式Intent
隐式Intent之界面跳转:
故名思意嘛,隐式也就是说,相比于显示Intent,隐式的Intent就更为隐蔽更为收敛含蓄了许多,它并不会明确的指出我们要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后把这个值交给我们的系统去分析我们的这个Intent然后找出相应合适的活动去启动。
系统会根据什么条件去查找呢,当然是在我们的AndroidManifest文件下面的
标签下配置的的内容,就可以指定我们的action和category,代码如下:
android:name=".FirstActivity"
android:label="@string/app_name" >
android:name="android.intent.action.MAIN" />
android:name="android.intent.category.LAUNCHER" />
在这里面我们便设置了我们的action,和我们的category,在这里也要强调一句,这两个值也是系统给我们的,当满族这两个值的时候也会是我们系统的默认的首先启动的Activity。
然后我们便可以在我们的activity中设置我们的事件了:
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestWindowFeature(getWindow().FEATURE_NO_TITLE);
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("android.intent.action.MAIN");
startActivity(intent);
}
});
}
}
可能有人会好奇了,为什么在这里我们仅仅制订了一个
,并有制定我们的,这是因为在我们的系统调用startActivity的时候会默认的为我们调用一个默认的即android.intent.category.DEFAULT,所以一个默认的就会被调用到Intent当中了。通过运行程序我们就会发现我们跳入了的值为我们设定的activity了。
下面我们要强掉一下的就是,我们的一个隐式的Activity的启动的方式里面,只能够拥有一个
但是可以同时用拥有多个例如:
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestWindowFeature(getWindow().FEATURE_NO_TITLE);
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("wo_shi_di_yi_ge_category");
intent.addCategory("wo_shi_di_er_ge_category");
startActivity(intent);
}
});
}
}
到这里我们通过隐式Intent启动一个新的activity的介绍就结束了。
隐式Intnet的更多的用法:
在刚刚的介绍中我们仅仅介绍到了,利用隐式intent来启动我们的另外的一个activity,实际上隐式的intent还可以做更多的事情。当我们使用隐式intent的时候我们还可以调用一些,并不是我们程序内部的活动,这便使得我们安卓多个程序之间的功能的共享成为了可能,例如:当我们的app里面的功能需要调用到一个浏览器的时候,我们不可能事先写好了一个浏览器然后嵌套进入我们的app,那么我能便可以通过隐式的intent调用系统的浏览器,当然intent还可以调用很多很多的东西,例如想调用系统的拨号权限,或者系统发短信的权限等等。
下面为大家介绍一下如何调用系统的浏览器:
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestWindowFeature(getWindow().FEATURE_NO_TITLE);
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
}
}
这样我们便可以调用我们的系统的浏览器啦。我们在刚才的代码用涉及到了一个setData()的方法,是用于指定我们接受的是一个Uri的对象,用于我们当前的Intent操作的数据,这些数据当然就是以字符串的形式传入到Uri.parse()的方法中解析产生的。
其实我们也可以在我们的中再配置一个的标签,用于更加精准的指出我们想让当前活动响应什么样的类型的数据,标签还可以添加一下的配置内容:
1.android:scheme
用于指定数据的协议部分,如上例中的http部分。
2.android:host
用于指定数据的主机名部分,树上里中的www.baidu.com部分。
3.android:port
用于指定数据的端口部分,一般紧随在主机名之后。
4.android:path
用于指定主机名和端口之后的部分,如一段王志忠跟在域名之后的部分。
5.android:mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行制定。
注:我们并不建议在我们的标签中使用过多的内容,因为只有在Intent的Data和标签中的内容完全一致时,程序才能够响应当前的Intent。
以上便是我对Intent的所有内容进行的一个总结。