Android 如何启动其他包中的Activity组件
《》我们一般在使用StartActivity和Intent启动Activity的时候,通常当前的Activity和将要启动的目标Activity位于同一个包中,但是如果将要启动的目标Activity和当前的Activity位于不同的包中,怎样启动呢?这就要解决以下两个问题:
1、如何在Manifest.xml文件中配置不同包中Activity
2、如何在当前的Activity中启动另一个包中的Activity
如何在Manifest.xml文件中配置不同包中Activity
在另一个包中创建一个Activity不用多说,那么如何在Manifest.xml文件中配置这个Activity呢?
比如:我们刚开始在 com.penglee.intent1 这个包中创建了一个Activity_Intent的Activity的子类作为程序的启动加载的Activity,
之后又在这个包中又创建了一个ThirdActivity的Activity类,
最后在com.penglee.intent2 这个包中定义了一个SecondActivity,
那么在Manifest.xml中应该这样配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.penglee.test_intent1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".Activity_Intent" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ThirdActivity"> <intent-filter> <action android:name="com.penglee.test_intent1.THIRD_ACTION"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.penglee.test_intent2.SecondActivity"> <intent-filter> <action android:name="com.penglee.test_intent1.Second_ACTION"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
从上面的代码中有以下几点需要知道:
1、<manifest
package="com.penglee.test_intent1"
....................................................
>
这个标签中的package中指明的包将作为标识整个应用程序的包名(我们之前说过,包名唯一标识一个Android程序),一般我们创建的第一个包就被指定为这个包名
2、我们发现在com.penglee.intent1包中定义的Activity_Intent和ThirdActivity在配置时候,
<android:name =".Activity_Intent"> ,
<android:name =".ThirdActivity">,
实际上Android中规定,用于声明Activity的android:name字段,应该使用类的全限定名,也就是 包名.类名 ,但是由于这两个类都在 1、中提到的程序级包名中,那么Android规定,这时可以将包名简写为 “ . ” ,在编译的时候,程序会自动的根据这个程序级包名,将类的全限定名补全
3、由于SecondActivivty在单独的包中,那么就只能够使用全限定名来进行配置了
如何在当前的Activity中启动另一个包中的Activity
在上面的程序的基础上,我们想要在Activity_Intent中添加一个按钮,当单击这个按钮的时候,就会启动SecondActivity,代码为:
public class Activity_Intent extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity__intent);
Button bt = (Button) findViewById(R.id.button);
bt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
ComponentName comp = new ComponentName(Activity_Intent.this, com.penglee.test_intent2.SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
startActivity(intent);
}
});
}
上面我们使用的是为Intent设定Component , 使用的方法是
ComponentName(Context pkg , Class<?>cls) ;
我们通常使用的直接在创建的时候指定 如 : Intent intent = new Intent(Activity_Intent.this , com.penglee.test_intent2.SecondActivity.class)
实际上使用的构造方法是:Intent(Context pkg , Class<?>cls) ;
我们来解释一下这两个参数到底是什么意思:
我们知道用显示Intent的方法,最终Intent最终会指明到底要启动那个组件,那么我们如何唯一确定一个组件呢?
首先,我们需要知道这个组件所在的应用程序,之后需要知道组件的类名,那么好,可以知道:
上述方法中参数Context pkg,实际上应该能够指明应用程序所在的程序级包名,而 Class<?>cls指明组件的类名,
好了那么上面我们使用new ComponentName(Activity_Intent.this, com.penglee.test_intent2.SecondActivity.class);也就非常明白了,使用程序级包下的一个Activity能够使程序知道程序级包名
好了,有了这个观念,我们就能够知道下面方法的参数应该如何设置:
ComponentName(String pkg , String cls) ;
pkg应该设为 “com.penglee.test_intent1” 而不是“com.penglee.test_intent2”, cls应该设为“com.penglee.test_intent2.SecondActivity”
其他的ComponentName的构造方法,和Intent的构造方法的参数的使用就非常的简单了
至于使用“隐式的Intent”的话,就没有上面说的问题了,因为,使用隐式的Intent根本就没有含有上面的参数的方法,不用纠结这些问题了

浙公网安备 33010602011771号