Android组件(二)Intent
Android组件(三)Broadcast
1.Intent
Intent本意为目的、意图,是Android程序中各组件进行交互的一种方式,它不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,启动服务以及发送广播等场景。
2.显式Intent
2.1显式Intent,即指定组件形式
指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)或者直接用构造器Intent(Context,Class)。通过指定具体的组件类,通知应用启动对应的组件
2.2 显示Intent启动活动
重载构造函数Intent(Context packageContext,Class)。第一个参数Context为启动活动的上下文,第二个参数Class则是想要启动的目标活动,通过这个构造函数可以构建出Intent的意图“Context”情况下执行“Class”。为了使用这个Intent,Activity类提供了一个startActivity()方法用于启动活动,它结收构建好的Intent参数。
2.3 启动活动代码实现
Button button_fillrom = (Button)findViewById(R.id.button_fillrom);
button_fillrom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,fillrom.class);
startActivity(intent);
}
});
首先构建一个Intent传入MainActivity.this作为上下文,传入fillrom.class作为目标活动,通过 startActivity(intent)执行这个Intent。执行结果为点一下button,启动fillrom.class,跳转到其所在界面。
3.隐式Intent:没有指定comonent属性的Intent
隐式Intent并没有明确指定要启动的活动,而是指定了更为抽象的action,category,data等信息,然后交给系统去分析这个Intent并找出合适的活动。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
< intent-filter >标签用来定义该activity可以被哪些intent激活
3.1 action
Action:用来指明要实施的动作是什么,隐式intent传递过来的action,如果和< intent-filter>中个任意一条元素匹配,那么该Intent就可以激活该activity
常用Action:
Action常量 | 字符串 | 说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 作为Task中第一个Activity启动 |
ACTION_CALL | android.intent.action.CALL | 启动一个电话,并可以使用tel:phone number指定电话号码 |
ACTION_EDIT | android.intent.action.EDIT | 显示用户输入数据 |
ACTION.ALL_APPS | andriod.intent.action.ALL_APPS | 列出所有应用 |
ACTION_DIAL | android.intent.action.DIAL | 显示拨号面板 |
ACTION_INSERT | android.intent.action.INSERT | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 用户数据同步 |
ACTION_VIEW = | android.intent.action.VIEW | 显示用户数据 |
用于显示用户的数据
3.2 Category
Category:一个字符串,包含了关于处理该intent的组件的种类的信息,相当于活动要被执行需要的环境。一个intent对象可以有任意个category。intent类定义了许多category常数。
Category常量 | 字符串 | 说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category,按照普通的Action执行方式执行,所有intent都可以激活。 |
CATEGORY_TAB | android.intent.category.TAB | 指定Activity作为TabActivity的Tab页 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | 表示该组件为 |
CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
CATEGORY_HOME | android.intent.category.HOME | 设置该Activity随系统启动而运行 |
CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 设置Activity是参数面板 |
3.3 Data
Data:具体要操作的数据,一般为Uri指定
<data
android:scheme="android"
android:host="android.intent.action.data"
android:path="/target"
android:port="8080">
</data>
android:scheme 匹配Uri中的前缀,用于指定数据的协议
android:host 匹配Uri中的主机名
android:path 匹配Uri中的路径
android:port 匹配Uri中的端口
android:mimeType 用于指定可以处理的数据类型
4.使用隐式Intent启动活动
4.1 启动自己程序内的活动
调用Intent中的addCategory()来添加一个category
Button button_fillrom = (Button)findViewById(R.id.button_1);
button_fillrom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(com.example.activity.ACTION_START);
intent.addCategory("com.example.fillram20.MY_GATEGORY");
startActivity(intent);
}
});
在< intent-filter >中响应这个category
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.ACTION_START" />
<category android:name="android.intent.category.DEFFAULT" />
<category android:name="com.example.fillram20.MY_CATEGORY"/>
</intent-filter>
</activity>
4.2 启动其他程序的活动
4.2.1 调用系统浏览器打开百度
@Override
public void onClick(View v) {
Intent intent = new Intent(com.example.activity.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
首先指定Intent的action是ACTION_VIEW,然后通过通过Uri.parse()方法,将一个网址字符串解析为一个Uri对象,再调用Intent的satData()方法将这个Uri对象传递出去。
4.2.2 调用系统拨号界面
@Override
public void onClick(View v) {
Intent intent = new Intent(com.example.activity.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
先指定Intent的action是Intent.Action_DIAL,,然后在data部分指定了协议是tel,号码为10086。
5.使用Intent传递数据
5.1 向下一个活动传递数据
@Override
public void onClick(View v) {
String data = "Hello SecondActivity"
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
使用显示方式启动SecondAcivity,并通过putExtra()方法传递一个字符串,putExtra()中有两个参数,第一个为键值,用于之后取值,第二个为具体数据。
public class fillramtest extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data)
}
}
通过getIntent()方法取到用于启动SecondAcivity的Intent,然后调用getStringExtra(),传入相应的键值,取出数据。如果传递的数值为整型数据,则使用getIntExtra()方法,若为布尔型数据,则使用getBooleanExtra()方法。
5.2 向上一个活动返回数据
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1)
}
返回上一个活动时只需要back就可以,并没有一个用于启动活动的Intent用于传递数据,所以使用startActivityForResult()方法,在活动销毁时返回一个结果给上一个活动。
public class fillramtest extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2);
Button button= (Button)findViewById(R.id.button_2);
button_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello MainActivity");
setRecult(RESULT_OK,intent);
finish();
}
});
}
}
使用了setRecult()方法向上一个活动返回数据,前一个参数用于向上一个活动返回处理结果,一般为RESULT_OK或RESULT_CANCELED,第二个参数吧带有数据的intent传递回去。由于使用startActivityForResult()方法启动SecondActivitty,在其被销毁后会调用onActivityResult(),须在MainActivity重写这个方法。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case 1:
if (requestCode==RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("MainActivity", returnedData)
}
break;
default:
}
}
onActivityResult()中含有三个参数:
1)requestCode:启动时输入的请求码
2)resultCode:返回数据时输入的处理结果
3)Intent data:携带返回数据的Intent
一个活动可能会调用startActivityForResult()去启动不同的活动,每一个活动 返回数据都会回调到onActivityResult()中,所以先检查requestCode的值判断数据来源,再通过resultCode检查处理结果是否成功,最后从data中取值。