Android学习之路(三)之 显式Intent对于Activity之间的多种跳转方式

来源:互联网 发布:大富豪棋牌源码三网通 编辑:程序博客网 时间:2024/05/29 03:21

显式Intent对于Activity之间的多种跳转方式

Intent能实现Android上三大组件的通讯:Activity、Service、Broadcaster。

这里主要写一下关于Activity之间的4种跳转方式。

第一种:Intent对象的setClass方法

在setClass方法中存在2个参数,第一个是Context对象(传入当前Activity),第二个Class对象(跳转的Activity的Class对象),Context是什么鬼?我们来看一下他的继承关系:

可以看到Context是Activity的父类,由于我们主类继承的是Activity,所以,这里直接传入this这个参数即可。后面那个Class对象,则就传入目标Activity的Class对象即可。

代码如下:

Intent intent1 = new Intent();intent1.setClass(this, Activity03.class);startActivity(intent1);

第二种:Intent对象的setClassName方法(有两种)

在Intent对象中的存在了两种setClassName方法,如下:

setClassName(Context packageContext, String ClassName):intentsetClassName(String packageName, String ClassName):intent

第1种方法中,存在两个参数Context对象和String对象,相对于第一种差别的就是第二个参数,那么,第二个参数根据ClassName可以看出,这个是一个类名,也就是要找到目标Activity的类名,但是,这里光写单纯的类名是不行的,要写上全类名。比如说:  "com.example.adroid_3.Activity03" ,第一个参数还是this。

第2种方法中,存在两个String对象的参数,分别是当前Activity的包名和目标Activity的全类名。即

setClassName("com.example.android_3","com.example.android_3.Activity03");

我们知道,如果要不同的android程序安装到同一台android机器上,必须的条件就是两者的包名不同,否则就无法安装,那么上面那种方法可以看到第二个参数是一个全类名,也就是同时包含了一个包名,那么如果第二个参数是另一个程序的包名加类名呢?是不是可以实现从这个程序的Activity跳转到另一个程序的Activity上呢?显然这是可以的,但是这里还要注意一点,如果跳转的目标Activity是主Activity,那么没什么问题,但是如果是非主Activity呢?如果单纯的这么操作,那么运行程序,并且实现该Intent的时候必然会出现报错的问题,那么,这里就要注意一个权限问题,因为如果目标Activity是非共享的(主Activity除外),那么就无法通过一个程序的Activity跳转到这个非共享的Activity,那么,如何解决这个问题呢?只需要在目标程序的AndroidManifest.xml中添加一个android:exported="true"属性就可以了,其中true表示可共享,false表示不可共享。

第三种:Intent对象的setComponent方法

其实这个方法里面又分了很多种,就不一一叙述了,简单介绍一种吧。

setComponent(ComponentName component):intent
可以看到里面是一个ComponentName对象,怎么用呢?

setComponent(new ComponentName(this, Activity03.class));
new一个ComponentName对象,里面的参数就是同上面三种一样啦。

这次写的程序,就是4个按钮实现不同的跳转方式。

代码如下:

package com.example.android_3;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener{Button btn_1 = null;Button btn_2 = null;Button btn_3 = null;Button btn_4 = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_1 = (Button) findViewById(R.id.btn_1);btn_2 = (Button) findViewById(R.id.btn_2);btn_3 = (Button) findViewById(R.id.btn_3);btn_4 = (Button) findViewById(R.id.btn_4);btn_1.setOnClickListener(this);btn_2.setOnClickListener(this);btn_3.setOnClickListener(this);btn_4.setOnClickListener(this);}@Overridepublic void onClick(View v) {if(v.getId() == R.id.btn_1) {Intent intent1 = new Intent();intent1.setClass(this, Activity03.class);startActivity(intent1);}if(v.getId() == R.id.btn_2) {Intent intent2 = new Intent();intent2.setClassName(this, "com.example.android_3.Activity03");startActivity(intent2);}if(v.getId() == R.id.btn_3) {Intent intent3 = new Intent();intent3.setClassName("com.example.android_3", "com.example.android_3.Activity03");startActivity(intent3);}if(v.getId() == R.id.btn_4) {Intent intent4 = new Intent();intent4.setComponent(new ComponentName(this, Activity03.class));startActivity(intent4);}}}

好啦,关于显式Intent的用法就先写到这了。




0 0
原创粉丝点击