从不同的包装发起活动

时间:2010-04-30 01:49:53

标签: android

我在第一个包中有活动A,我想运行一个意图,该活动会启动第二个包中的活动B.

我该怎么做?欢迎任何样品。

这就是我所做的,以及我得到的错误:

包中的第一个活动(“MainActivity”):com.abelski.currencyclient 和第二个活动(不同包中的“SecondActivity”:com.idan.second

现在我想从MainActivity打电话给SecondActivity。

我已将此行添加到MainActivity的清单中:

 <activity android:name="com.idan.second.SecondApplicationActivity"></activity>

现在在主Activity中我得到了这个按钮来运行这一行:

Intent intent = new Intent(MainActivity.this,SecondApplicationActivity.class); 

这就是rror:

04-29 09:20:59.197: ERROR/AndroidRuntime(399): Uncaught handler: thread main exiting due to uncaught exception
04-29 09:20:59.276: ERROR/AndroidRuntime(399): java.lang.NoClassDefFoundError: com.idan.second.SecondApplicationActivity
04-29 09:20:59.276: ERROR/AndroidRuntime(399):     

5 个答案:

答案 0 :(得分:22)

我假设“套餐”是指申请。

我们有: - 带有FirstActivity的ApplicationA - 具有SecondActivity的ApplicationB

如果在ApplicationB的AndroidManifest.xml文件中,在SecondActivity的声明中添加了一个intent过滤器,例如:

<activity android:name=".SecondActivity">
  <intent-filter>
    <action android:name="applicationB.intent.action.Launch" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

您可以使用以下命令创建一个Intent以从FirstActivity启动此SecondActivity:

Intent intent = new Intent("applicationB.intent.action.Launch");
startActivity(intent);

这一切意味着什么:

  • SecondActivity有一个针对“applicationB.intent.action.Launch”的意图行为的过滤器
  • 当您使用该操作创建一个intent并调用'startActivity'时,系统会找到响应它的活动(如果有的话)

此文档位于:https://developer.android.com/reference/android/content/Intent.html

答案 1 :(得分:9)

我遇到了同样的问题,解决方案是包名根目录中的另一个级别。

如果您有两个软件包“com.first ....”和“com.second ...”,则清单引用“com.first”。然后,您可以重构两个包,以便重用第一部分。例如,“com.package.first”和“com.package.second”。然后你的清单也必须更新

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.package">
...

    <activity android:name=".first.FirstPackageActivity" android:label="FirstPackageActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".second.SecondPackageActivity" android:label="SecondPackageActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

您的java代码可以创建一个intent并以通常的方式启动活动:

Intent intent = new Intent(this,ActivityClassName.class);
startActivity(intent);

答案 2 :(得分:1)

如果你在这里提到的软件包与应用程序相同,我认为问题Android: Starting An Activity For A Different Third Party App中的答案更简单。对于该问题的第一个答案,你不需要对你的第二个应用程序进行任何修改

答案 3 :(得分:0)

使用显式意图:

Intent intent = new Intent(context,ClassName.class);

其中ClassName来自另一个包。

有时,在这种情况下,您将无法知道类的名称,您将不得不依赖目标类通告要处理的Intent。

答案 4 :(得分:0)

首先,您需要在Manifest上声明包和活动:

        <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

,对于第二个活动,在android:name->上。打包name.activity,假设您的第二个包名称为com.iden.second:

    <activity android:name=".second.SecondActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
        <intent-filter>
            <action android:name="android.intent.action.SECOND" />

            <category android:name="android.intent.category.SECOND" />
        </intent-filter>
    </activity>

然后在MAINACTIVITY JAVA CLASS上,假设您将使用按钮开始第二个活动:

public class MainActivity extends AppCompatActivity {

private Button mButtonSecond;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mButtonSecond = findViewById(R.id.btn_second);

    mButtonSecond.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent newActivity = new Intent(MainActivity.this,com.iden.second.SECOND.class);
            startActivity(newActivity);
        }
    });
   }
}

希望能有所帮助,因为我不清楚问题的结构