描述利用Intend实现Activity活动之间的三种跳转方式的不同点

 我来答
xiangjuan314
2016-06-07 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:3049万
展开全部
An intentis an abstract description of an operation to be performed一个Intent
就是一次对将要执行的操作的抽象描述
Intent支持Android设备上可用的任意两个应用程序组件之间的交互,不管它们是哪个应用程序的一部分都是如此。这就把一个相互独立的组件集合编程了一个互联的系统。
Intent最常用的一个用法是显示地(通过制定要加载的类)或者隐式地(通过请求对一组数据执行某个动作)启动新的活动。
Intent也可以用来在系统范围内广播消息。任何应用程序都可以注册一个广播接收器来监听和响应这些广播的Intent。这样就可以基于内部的、系统的或者第三方的应用程序事件,创建事件驱动的应用程序。
Android使用广播Intent来公布系统事件,例如,网络连接状态或者电池电量的改变。本地Android应用程序(如拨号程序和SMS管理器)可以简单地注册监听特定的广播Intent的组件——例如来电或者接受SMS消息,并作出响应的响应。
使用Intent来传播动作——甚至在同一个应用程序内——事一种基于Android设计原则。它鼓励组件之间的分离,允许无缝地替换应用程序元素。它还提供了一个简单的用于扩展功能模型的基础。
Android使用了Intent这个特殊类,实现在屏幕与屏幕之间移动。Intent类用于描述一个应用将会做什么事。在Intent的描述结构中,有两个最重要的部分:动作(action)和数据产生反应(datato action upon)。典型的动作类型有:MAIN(activity的门户,程序的入口点)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。
与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intentfilter则用于描述一个activity(或者IntentReceiver)能够操作哪些intent。一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示 一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。
通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:
A、Activities能够重复利用从其它组件中以Intent的形式产生的一个请求;
B、Activities可以在任何时候被一个具有相同IntentFilter的新的Activity取代。
下面来看代码
一、使用Intent来启动或停止活动(显示地)

[java] view plain copy
public class Intent1Activity extends Activity {
private Button btn = null;
private TextView tv = null;
//还是用个变量比较好,原因在于你这个页面可能有两个button都是转到别的页面
//回调的时候你必须要根据这个来判断的,直接写数字别人不易理解
private final int REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intent1);
tv=(TextView)findViewById(R.id.intent1textview);
btn = (Button)findViewById(R.id.intent1button);
//设置单击事件
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
//intent.setClass(Context context, Class<?> clazz);
//第一个参数指的就是要跳转的那个Activity
//第二个指的是跳到的那个Activity
intent.setClass(Intent1Activity.this,
Intent2Activity.class);
intent.putExtra("str1", "hello...");
intent.putExtra("str2", "world...");
//如果要传一个对象呢?intent.pputExtra(String name,
Serializable value);
//startActivity(intent);//这个是如果没有回调的时候直接这样就好
//如果我们希望下一个Activity回传参数咋办呢?上面的就不行了
startActivityForResult(intent, REQUEST_CODE);
}
});
}
//如果没有回调也不用重写这个方法
@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
//第一个指的是这个页面的requestcode
//第二个是Intent2Activity里面的requestcode
if(requestCode != REQUEST_CODE){
tv.setText("wrong");
}
if(resultCode != new Intent2Activity().REQUEST_CODE){
tv.setText("wrong");
}
String result = data.getExtras().getString("str3");
tv.setText(result);
}
}
public class Intent2Activity extends Activity {
private Button btn = null;
private TextView tv = null;
protected final int REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intent2);
tv = (TextView)findViewById(R.id.intent2textview);
btn = (Button)findViewById(R.id.intent2button);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
String str1 = bundle.getString("str1");
String str2 = bundle.getString("str2");

tv.setText(str1+"\t"+str2);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("str3", "Back Data");
setResult(REQUEST_CODE, intent);
finish();
//调用这个方法,那么此Activity关闭,并把它从栈中移除。
//然后进入到前一个Activity
}
});
}
}
二、使用Intent打电话,发短信(隐式地)
隐式的Intent提供了一种机制,可以让匿名的程序组件为请求的动作服务。
当构建一个新的隐式的Intent来使用startActivity的时候,需要指定一个要执行的动作,另外,还可以提供执行那个动作需要的数据。
当使用这个新的隐式Intent来启动一个活动时,Android将在运行时把它解析为最适合在指定的数据类型上执行动作的类。这就意味着可以创建使用其他应用程序功能的项目,而不必提前确切地知道是哪个应用程序给你提供了这种功能。就比如,如果希望让用户从应用程序中打电话,那么不必实现一个新的拨号程序,而可以使用一个隐式的Intent来请求一个在电话号码(表示为一个URI)上执行(call a number)的动作

[java] view plain copy
public class IntentCallActivity extends Activity {
private Button btn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intentcall);
btn = (Button)findViewById(R.id.intentcallbutton);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//下面的是电话
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);
//下面的是短信
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:5554"));
intent.putExtra("sms_body", "welcome...");
startActivity(intent);
/*
显示的代码
Intent intent = new Intent();
intent.setClass(Intent1Activity.this,
Intent2Activity.class);
intent.putExtra("str1", "hello...");
intent.putExtra("str2", "world...");
startActivityForResult(intent,REQUEST_CODE);
*/
}
});
}
}

但是运行却发现错误,原因就在于安全考虑这个方面。
Android肯定不会允许一个程序能够随意的拨打电话发送短信而不通过用户的通过。
我们在手机上网的时候遇到这种情况吧。
解决办法听简单的,在manifest.xml中的application节点这样。

[html] view plain copy
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name= "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式