Android中intent的使用
intent,顾名思义,是一种目的,不仅可以指明当前组件的目的,也可以传递数据。intent的使用非常广泛,本文只在启动活动方面做一些介绍,如有不对或者补充的地方,欢迎指出。
显式intent跳转Activity
显式intent,即是一种非常明显的目的。由当前Activity跳到指定的Activity。使用的方式为,先构造一个intent,传入当前的Activity与需要跳转到的Activity。然后再启用Intent。
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
当配合Button组件使用时,即按下按钮跳转到另一个Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=(Button)findViewById(R.id.bu01);
//buo1为xml界面定义的buttonID
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,SecondActivity.class);//SecondActivity为目的Activity
startActivity(intent);
}
});
}
隐式intent跳转Activity
隐式intent就比较含蓄,它的原理有点类似于相亲,你并不知道你要转到哪个Activity,但是你对心仪的对象有一些小要求,而恰好你相亲的对象能满足你的条件,那么恭喜你,相亲成功(当前Activity也就转到了你相亲对象的Activity)。而我们需要做的,就是给(目标对象)Activity添加响应信息,给(你)原Activity添加响应要求。
怎么做呢,
第一步:咱们先给目标对象添加响应信息吧,具体的是在XML的目标对象下配置一个信息,举例
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.intent.ACTION_START"/>
<category android:name="android.intent,category,DEFAULT"/>
</intent-filter>
</activity>
我们在SecondActivity内添加了两个信息,一个是
action
,一个是
category
,可以简单理解为
外貌
与
三观
(此处斜眼笑),具体的信息在引号内,随你写。
第二步:咱们给原Activity添加要求
button1.setOnClickListener(new View.OnClickListener() {/隐式intent
@Override
public void onClick(View v) {
// Intent intent =new Intent(MainActivity.this,SecondActivity.class);
Intent intent=new Intent("com.example.intent.ACTION_START");//你的具体要求
startActivity(intent);
}
});
然后,你惊奇地发现你的action(外貌)要求与我们最开始写的信息居然完美符合,那恭喜你们配对成功。那可能有人觉得很奇怪,明明只有外貌符合要求,三观(Category)要求都没写,这也能配对?然后细心的你会发现,我们给女方(目标Activity)添加信息时,Category一栏写的是DEFAULT,这个单词是默认的意思,说白点,就是说如果你对她没有特殊的三观要求,她就没有意见,这是嫁鸡随鸡嫁狗随狗的女方,你还要求啥三观呢?
当然如果你对三观有着执着的要求,你大可以在你的要求栏下再添加一行代码比如
intent.addCategory(com,exampel.activity.MY_CATEGORY);
这样的结果就是你可能找不到对象,除非你在女方下也添加相应的信息。
隐式intent打开网页
本来讲完了上述内容我的文章已经写完了,但是,多写点也无妨,因为隐式intent的用法更加广泛,他能与其他程序互通,也能打开网页。
button1.setOnClickListener(new View.OnClickListener() {//显示intent
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http:www.baidu.com"));//上述两行为你相亲的要求
startActivity(intent);
}
});
效果图如下
为了更好掌握这点代码的原理,你可以将网页也理解成一个Activity,不同的是,网页的intent-fliter中的action信息为“Intent.ACTION_VIEW”常量,而且在intent-fliter里还配置了另一个信息data,data信息中又包含了sheme(数据协议),host(主机名)等信息。而上述代码
intent.setData(Uri.parse("http:www.baidu.com"));
就是对响应信息的要求。
利用intent传递数据
传递数据分为两种,向下一个Activity传递数据,和将数据返回给上一个Activity.
向下一个Activity传递数据
我们以传递一个字符串为例,咱们要干什么事呢
第一步,将字符串存到一个字符串字符串对象中
第二步:利用显示intent跳转到目的Activity
第三步:给字符串对象找一个键值并传入intent中,
第四步:在目的Activity中获取intent
第五步:获取intent中的键值
第六步:取出键值对应的字符串并打印出来
具体的代码实现
具体实现如下
在当前Acivity中
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="hi";//第一步
Intent intent =new Intent(MainActivity.this,SecondActivity.class);//第二步
intent.putExtra("E",data);//第三步
startActivity(intent);
}
});
在目标Activity中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent=getIntent();//第五步
String data=intent.getStringExtra("E");
Log.d("SecondActivity",data);//第六步
}
这样是不是很好理解?而其中接触的新函数putExtra()与intent.getStringExtra()的用法也显而易见了。至于为什么要通过键值来传递数据,我怎么知道,它的参数就是这么给的(来自菜鸟的吐槽)
打印出来的日志如下
将数据返回给上一个活动
intent是启动Activity时传递数据的,那么如果销毁一个Activity时,如何向上一个Activity传递数据呢。
答案是使用Activity里两个自带的函数startActivityForResult()与onActivityResult(),第一个函数是启动另一个Activty的函数并要求一个返回值,而这个返回值就是通过onActivityResult()返回的。
实现效果
:A启动B,B销毁并返回一个字符串
具体的实现步骤如下
第一步:利用startActivityForResult()A启动B
第二步:在B里,将字符串赋予键值,并放进intent
第三步:调用SetResult()返回intent
第四步:销毁B
第五步:在A里重写onActivityResult(),因为我们需要把传过来的字符打印出来,让你看到你传递成功了
具体代码如下
A中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=(Button)findViewById(R.id.bu01);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);//第一步,第二个参数是请求码
}
});
}
A中第五步
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)//第一个参数式启动活动时传入的请求码,只有请求码配对,才能往下执行。第二个参数是返回数据时的处理结果,第三个参数是data
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnedData =data.getStringExtra("data_return");
Log.d("MainActivity",returnedData);
}
break;
default:
}
}
B中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.bu1);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "hello");//第二步
setResult(RESULT_OK, intent);//第三步。第一个参数是返回结果
finish();第四步
}
});
}
值得注意的是
,我在实现的过程中发现当按下B中的按钮,finish()执行了但并不会直接销毁B,还需要再按一下按钮才能销毁并返回intent。(具体的解决方法我也不是很清楚。)
运行之后我们可以在日志中看到