在使用郭霖大神的《第一行代码》学习安卓开发后对Intent的一些小笔记。
Intent组件 在安卓开发中相似于信使,但有彻底不是的一种组件。它是链接四大组件的重要组成部分。
一、Intent的概念:java
Android中提供了Intent组件来辅助应用间的信息传递,它也可用于应用程序内部的activity,service和broadcast receiver之间的交互。android
Intent是一种运行时绑定(runtime
binding)机制,它能在程序运行的过程当中链接两个不一样的组件。经过Intent,你的程序能够向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。web
二、Intent的两种使用方式显示Intent和隐式Intentide
首先是显示Intentsvg
在一个活动的按钮点击事件中
增长学习
Intent intent =new Intent (当前活动.this,要启动的活动.class);
StartActivity(intent);
好比在First的活动中启动second活动能够这么写网站
Intent intent =new Intent (First.this,second.class);
StartActivity(intent);
这种方法不须要在AndroidManifest.xml中额外添加代码this
接下来是手机应用比较多的隐式Intent
提到隐式Intent以前简单说一下Intent的启动过程
所谓的隐式启动就是不指明启动那个活动,而是从全部活动中筛选出符合条件的活动。若是有多个活动会提示选择一个活动。那么筛选的过程就如上图所示(灵魂做图手。。→_→)
首先在AndroidManifest.xml你要启动的活动中添加spa
Action 后引号的内容为当前活动的名字能够随意命名。
标签则附加了一些信息,精确指明当前活动可以响应Intent的可能还有cate。
注意只有当Action和category的内容等同时匹配,Intent指定的ACtion和category时,活动才能响应Intent 换句话来讲就是才能启动。
关于按钮事件的代码须要加入code
Intent intent =new Intent(“com.example.activitytest.ACTION_START/*你在name中的名字*/”);
上述第三行,每一个Intent只能指定一个action可是却能指定多个category。
因此在此增长一个category,在依次关联的活动的按钮点击事件中增长
intent.addCategory("com.example.activitytest.MY_CATEGORY");
.
.
3.更多的隐式Intent用法以下
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.bilibili.com"));
startActivity(intent);
在按钮中增长这些 不须要在XML中注册,直接就能够打开网站。
setData() 他主要接受一个Uri对象,主要用于指定正在操做的数据。而后经过字符串的形式传到Uri.parse()方法中解析。
上述代码就是经过点击事件打开bilibili。
4.Intent对不一样组件发送消息的不一样机制
使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。
使用 Activity.setResult(),传入一个intent来从activity中返回结果。
将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。
将intent对象传给 Context.bindService()来绑定一个service。
将intent对象传给 Context.sendBroadcast()。
Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。
5.Intent的相关属性
component(组件):目的组件
action(动做):用来表现意图的行动
category(类别):用来表现动做的类别
data(数据):表示与动做要操纵的数据
type(数据类型):对于data范例的描写
extras(扩展信息):扩展信息
Flags(标志位):指望这个意图的运行模式
6.使用Intent传递数据
1、向下一个活动传递数据
在当前活动中首先定义传递的数据,而后使用Intent方法进行传递数据。
这里使用显示传递
Intent intent=new Intent(SecondActivity.this,ForthActivity.class);
//括号内的形式为(当前活动.this,传递给的活动.class);
intent.putExtra("extra_data",data);
//这里调用intent的putExtra()方法,括号内的内容是(你传递数据的名称,数据)
startActivity(intent);
//启动传递目标的活动。
而后在传递的目标活动中须要
Intent intent=getIntent();//此项主要用于启动上一个活动的Intent
String data1=intent.getStringExtra("extra_data");//取出数据,什么类型就用对应的方法此处是String 就用getStringExtra,若是是整型就用getIntExtra,括号内为传递数据的名称。
Log.d("SecondActivity",data1);//打印数据
2、返回数据给上一个活动
首先在第一个活动的按钮点击事件中
Intent intent=new Intent(firstActivity.this,secondActivity.class);//经过显式Intent启动第二个活动。
startActivityForResult(intent,1);//第一个参数是要打开的活动,第二个参数是请求码,用于在回调的过程当中判断数据来源。
在第二个活动的按钮事件中有
(经过点击按钮返回数据,并关闭当前窗口)
Intent intent=new Intent();
intent.putExtra("return_data","hello firstActivity");
setResult(RESULT_OK,intent);
finish();
此处的intent仅仅只是用于传递数据,没有“意图”。
SetResult(),接受的两个参数分别是,第一个用于处理上一个活动返回处理结果,第二个参数则是返回数据。
在第一个活动中接受数据的代码为
首先须要重写onActivityResult方法。
这个方法的三个参数分别是:启动活动时候的请求代码,返回数据时传入的处理结果,带着返回数据的Intent。注意第二个是处理事后的结果不是数据自己。
第一个参数主要是判断数据来源肯定是目标活动传来的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{
case 1:
if(resultCode==RESULT_OK) {
String returnData = data.getStringExtra("return_data");
//名称必定要对应
Log.d("firstActivity",returnData);
break;
}
default:
}
}
也能够不用点击按钮事件来返回数据。
在第二个活动中重写onBackPressed();方法
@Override
public void onBackPressed() {
Intent intent =new Intent();
intent.putExtra("return_data","Hello firstActivity");
setResult(RESULT_OK,intent);
finish();
}