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):intent setClassName(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; @Override protected 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); } @Override public 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的用法就先写到这了。