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根本就没有含有上面的参数的方法,不用纠结这些问题了

posted @ 2014-11-09 17:23  RoperLee  阅读(1135)  评论(0)    收藏  举报