Intent
Intent是Android程序中各组件间进行交互的一种重要方式,它不经可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据,Intent一般可被用于启动活动,启动服务以及发送广播等场景,具体的介绍可以参考http://3ms.huawei.com/km/blogs/details/9654795,Intent大致可以分为显示Intent和隐式Intent,Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?>cls),这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。
显示Intent
显示Intent时直接在创建Intent对象时传入上下文和目标活动,目前很明确,显示Intent的具体使用示例,通过点击按钮转入到第二个活动的交互。 修改FirstActivity按钮的点击事件,代码如下:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class)
startActivity(intent);
}
});
FirstActivity.this作为上下文,SecondActivity.this作为目标活动,通过startActivity()方法启动这个Intent.
隐式Intent
隐式Intent它并没有明确指出要启动那个活动,而是指定一系列更为抽象的action和category信息。然后交由系统去分析这个Intent.并帮助我们去找出合适的活动执行。隐式Intent通过在标签下配置内容来指定当前活动能够响应的action和category,在AndroidManifest.xml中进行配置,代码如下:
<activity
android:name=".SecondActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,标签则包含了附加信息,只有和中的内容同时能够满足匹配Intent指定的action和category时,这个活动才能响应intent.按钮点击事件代码如下:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//隐式intent
Intent intent = new Intent("com.example.activitytest.ACTION_START")
startActivity(intent);
}
});
还有更多隐式Intent的用法,比如使用隐式Intent来启动自己程序内的活动,还可以启动其他程序的活动。这使得Android多个应用程序之间的功能共享成为了可能。 示例1.通过按钮点击事件来调用系统的浏览器。
button1.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);
}
});
Intent的其他应用
- 向下一个活动传递数据
Intent中提供了一些列putExtra()方法的重载,可以把我们想要的传递的数据暂存在Intent中,启动了另一个活动后,只需把这些数据再从Intent中取出就可以了。示例,从FirstActivity传递一个字符串给SecondActivity中。
button1.setOnClickListener(new View.OnClickListener() {
@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);
}
});
从FirstActivity中通过putExtra()传递一个字符串"Hello SecondActivity"到SecondActivity中去,putExtra方法接收两个参数,第一个参数是键,第二个是值。 而在SecondActivity中需要接收传来的信息。代码示例
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
- 返回数据给上一个活动
在Activity中还有一个startActivityForResult()的方法用与启动活动,这个方法期望在活动销毁的时候能返回一个结果给上一个活动。startActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码。用于在之后的回调中判断数据的来源。 代码示例,使用startActivityForResult来启动SecondActivity,请求码是1.
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//返回数据给上一个活动
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent,1);
startActivity(intent);
}
而对于SecondActivity,需要注册按钮点击事件,并在点击事件中返回数据的逻辑,代码如下:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
//返回调用反馈信息
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();
}
});
}
}
在startActivity中创建了一个Intent,作用仅仅用于传递数据,将需要传递的数据存放在Intent中,然后调用setResult()方法用于向上一个活动返回数据,setResult()方法接收两个参数,第一参数用于向上一个活动返回处理结果。第二参数则把带有数据的intent传递回去。然后调用finish方法来销毁当前活动。由于使用startActivityForResult方法启动SecondActivity,在SecondActivity被销毁之后会回调上一个活动的onActivityResult方法,因此我们需要重写这个方法来得到返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
活动的生命周期
Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合。这个栈被称为返回栈(Back Stack)。默认情况下,每当启动一个新的活动时,它会在返回栈中入栈,并处于栈顶中。而当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈。
活动状态
1.运行状态:活动那个处于返回栈栈顶,活动处于运行状态 2.暂停状态:不处于栈顶位置,但仍然可见(如对话框) 3.停止状态:不处于栈顶,并且完全不可见,系统会为这种活动保存相应的状态和成员变量。 4.销毁状态:从返回栈中移除后就变成了销毁状态。系统最倾向于回收这种状态的活动。
活动的生存期
Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节 下图时7个方法在活动周期内的位置。
|