【问题标题】:launch activities from different package从不同的包启动活动
【发布时间】:2011-02-14 01:44:39
【问题描述】:

我在包 1 中有活动 A,我想运行一个意图来启动包 2 中的活动 B。

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

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

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

现在我想从 MainActivity 调用 SecondActivity。

我在 MainActivity 的清单中添加了这一行:

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

现在在主活动中,我得到了运行这一行的按钮:

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

这是错误:

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):     

【问题讨论】:

  • 我发现这里对“包”的使用令人困惑; package是java包还是应用包?
  • 请再次检查我的问题,我编辑它。

标签: android


【解决方案1】:

我假设您所说的“包”是指应用程序。

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

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

<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”意图操作的过滤器
  • 当您使用该操作创建意图并调用“startActivity”时,系统将找到响应它的活动(如果有)

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

【讨论】:

【解决方案2】:

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

如果您有两个包“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 = new Intent(this,ActivityClassName.class);
startActivity(intent);

【讨论】:

    【解决方案3】:

    如果你这里提到的包和application一样,我觉得Android: Starting An Activity For A Different Third Party App这个问题的答案比较简单。有了这个问题的第一个答案,你不需要对你的第二个应用做任何修改。

    【讨论】:

      【解决方案4】:

      使用明确的意图:

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

      其中 ClassName 来自另一个包。

      有时,您不知道类的名称,在这种情况下,您将不得不依赖目标类宣传的 Intent 来处理。

      【讨论】:

      • 它没有用,请再次检查我的问题,我已经编辑过了。
      【解决方案5】:

      首先,您需要在 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 --> .Packages 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);
              }
          });
         }
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多