在Android系统里,App间的通信和一个App内的Activity间的通信都是由Intent类对象来完成的. Android是一个高度中央集权制管理的系统, 基本上所有的操作都是向系统发出请求,由系统来完成的. 这种向系统的请求操作就是由Intent来实现.
Intent负责描述向系统请求操作的具体行为,涉及的参数及附带的数据等信息, Android系统根据Intent的描述信息作相应的操作。
Intent功能比较复杂, 其中用于Activity启动有两种方式:
1 显式启动的方式,即在创建Intent对象时,指定由当前的对象和要用于创建出对象的类. 然后用startActivity(Intent对象)来启动, 并可以启动前可用Intent的putExtras(..)设置要传递的参数
2 隐式启动的方式。 显式在启动时需要具体指定哪个类对象, 隐式启动只需指定一种系统操作, 至于这操体具体是由哪个类对象完成,这个不是由程序指定而是由系统及用户决定.
如实现需要打开www.baidu.com的页面, 至于使用哪个浏览器由系统决定:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intent);
用显式启动的方式实现两个Activity窗口跳转,并传递参数:
1 MyActivity窗口作主窗口,窗口只有一个按钮”START OTHERACTIVITY”, 点击按钮后出现另一个窗口OtherActivity窗口。 在OtherActivity窗口上只有一个TextView,显示”this is other activity”及显示从主窗口接收到的参数
2 主窗口创建Intent对象,并在创建时指定使用当前窗口对象创建出OtherActivity窗口, 并在启动窗口前设置传送字符串参数。
Intent intent = new Intent(MyActivity.this, OtherActivity.class);
intent.putExtra("what", "hello others"); //"what"是用于区分参数内容的关键字,接收时使用此关键接收相应的参数值
startActivity(intent); //根据Intent描述信息启动窗口
3 在OtherActivity窗口里获取参数值:
String str = this.getIntent().getStringExtra("what");
完整代码:
/* MyActivity.java */
package com.example.jk.a01hello;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MyActivity extends Activity {
private Button btn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //调用父类的功能
LinearLayout hlayout;
hlayout = new LinearLayout(this);
hlayout.setOrientation(LinearLayout.HORIZONTAL);
btn = new Button(this);
btn.setText("start OtherActivity");
hlayout.addView(btn);
setContentView(hlayout);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyActivity.this, OtherActivity.class);
intent.putExtra("what", "hello others"); //"what"是用于区分参数内容的关键字,接收时使用此关键接收相应的参数值
startActivity(intent);
}
});
}
}
/* OtherActivity.java */
package com.example.jk.a01hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
public class OtherActivity extends Activity {
private TextView label;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String str = this.getIntent().getStringExtra("what");
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
label = new TextView(this);
label.setText("this is other activity : " + str);
layout.addView(label);
setContentView(layout);
}
}
同时需要修改AndroidManifest.xml文件,声明两个Activity:
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OtherActivity">
</activity>
如需实现主窗口接收OtherActivity窗口的返回结果时,基于上面例子的更改:
MyActivity:
1 用startActivityForResult(intent, int requestCode)来启动Intent, requestCode用于区分接收多个启动窗口的返回结果
2 实现抽像函数void onActivityResult(int requestCode, int resultCode, Intent data)
, 当有启动窗口的返回结果时会自动触发此函数, 通过参数就可以得到具体的返回值
OtherActivity:
只要在窗口关闭前用setResult设置返回值即可
基于上面的例子修改,OtherActivity增加一个按钮, 点击按钮时设置返回结果,并关闭窗口.
/* MyActivity.java */
package com.example.jk.a01hello;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MyActivity extends Activity {
private Button btn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //调用父类的功能
LinearLayout hlayout;
hlayout = new LinearLayout(this);
hlayout.setOrientation(LinearLayout.HORIZONTAL);
btn = new Button(this);
btn.setText("start OtherActivity");
hlayout.addView(btn);
setContentView(hlayout);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyActivity.this, OtherActivity.class);
intent.putExtra("what", "hello others"); //"what"是用于区分参数内容的关键字,接收时使用此关键接收相应的参数值
startActivityForResult(intent, 77); // 77 为request_code
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.printf("requestCode:%d, resultCode:%d, data=%s\n", requestCode, resultCode, data.getStringExtra("return"));
}
}
/* OtherActivity.java */
package com.example.jk.a01hello;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class OtherActivity extends Activity {
private TextView label;
private Button btn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String str = this.getIntent().getStringExtra("what");
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
label = new TextView(this);
label.setText("this is other activity : " + str);
btn = new Button(this);
btn.setText("close");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setResult(RESULT_OK, new Intent().putExtra("return", "returning string"));
finish();
}
});
layout.addView(label);
layout.addView(btn);
setContentView(layout);
}
}