我们已经知道了Intent可以显式或者隐式地启动activity,其实Intent的用法还有很多,比如启动服务,发送广播消息等。下面我们来介绍一下如何使用Intent传递数据。
- Intent的语法
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(uriString))
- 第一个参数是intent要执行的动作,第二个参数是要传递的数据,这个数据可以是一个整数或者字符,也可以是一个地址、类等等。
我们结合这个demo来介绍一下Intent传递数据的方式。
首先是将第一页的名字传到第二页,我们使用了intent.putExtra这个方法。下面是点击事件的代码。
listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String name = list.get( position );
Intent intent = new Intent( test_main.this,test_add.class );//第二个参数是要传递给的类的名字
intent.putExtra( "name",name );
intent.addFlags( position ); //添加一个当前listview位置的标记
startActivityForResult( intent,1 ); //先不看
}
} );
我们点外卖时,外卖不会直接飞过来,而是由外卖小哥送过来,小哥先将外卖装到车子上,然后送到我们的家中。Intent的作用和外卖小哥类似,暂时存放数据,然后将数据发到应该发往的地方。
现在我们成功的将name的值放到了Intent中,接下来就是接受数据,然后返回一个值告诉第一个页面是否删除。这是第二个页面的关键代码。
TextView textView = findViewById( R.id.textview );
final Intent intent = getIntent();
final String name = intent.getStringExtra( "name" );//将Intent的数据保存到一个变量中
final int position = intent.getFlags(); //获取位置标记
textView.setText( name );
Button confirm = findViewById( R.id.confirm );
confirm.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
intent.addFlags( position );//设置返回位置标记
setResult( RESULT_OK,intent );返回intent
finish();
}
} );
这里需要注意,返回时一定要调用setResult()方法,第一个是结果码,第二个是返回值。结果码RESULT_OK代表正常返回数据。但是我们只是在第二个页面返回还不行,还需要在第一个页面接收。
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
int positionFlag = data.getFlags();
list.remove( positionFlag ); //删除listview中的值
adapter.notifyDataSetChanged();//更新listview列表
}
break;
default:
}
}
我们又再第一个页面重写了onActivityResult方法。这里的case:1,1代表request code,是第一段代码先不看位置的第二个参数。这样我们就掌握了简单的Intent传递数据的方法。
结语
- 其实Intent传递信息更多是用于广播消息(Brodercast),结合Intent过滤器,可以给其他的应用程序传递消息。有兴趣的同学可以继续学习。