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

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

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

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

第一种:Intent对象的setClass方法

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

Android学习之路(三)之 显式Intent对于Activity之间的多种跳转方式_第1张图片

可以看到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的用法就先写到这了。





你可能感兴趣的:(android,Android开发,intent)