Android:调用另一个应用程序的活动

Gra*_*ant 11 android android-activity

我有两个Android应用程序,假设它们是"A"和"B","A"有五个活动,我想从按钮点击事件"B"调用它的特定活动.我测试了这种从另一个应用程序调用的方法:

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
startActivity(LaunchIntent);
Run Code Online (Sandbox Code Playgroud)

"com.testapp.ws"是包名"A".

这从其第一个活动再次运行"A"而不是从特定活动.如何调用A的指定活动?

Fuz*_*gic 37

格兰特,

这里的问题显然是对Android应用程序模型的误解.Commonsware对于如何解决这个问题绝对正确.但是,如果不了解Android基础知识,我就会明白为什么你在应用它时遇到了困难.所以,快速解释一下:

Android中的每个操作都以Intent开头.活动尤其如此.每个活动都有一个意图.为了使开发人员易于使用界面,您可以从操作系统中响应Intent,或者您可以从Activities类创建一个Intent来使用.通常,最佳做法是执行第一个选项.

回应意图

当选择一个意图来回应时,你可以直接回应任何意图.这称为动作.如果我创建了一个名为"FOO"的Intent,那么Bar Activity就可以选择它并做出回应.但是,我们有约定,其中主要是将您的包名称添加到您创建的任何Intent中.例如"com.company.package.FOO".简而言之,这是为了避免与其他应用程序发生冲突.

每个活动都可以响应不同的事件.这在AndroidManifest.xml中定义.

<activity android:name="Activity3" ... >
    <intent-filter>
      <action android:name="com.company.package.FOO"/>
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

在上面,我们还将类别设置为DEFAULT,这样除非用户更改它,否则我们将成为唯一响应自定义Intent的应用程序.然后我们调用Intent的方式是使用我们创建的SAME NAME(即"com.company.package.FOO")

startActivity(new Intent("com.company.package.FOO"));
Run Code Online (Sandbox Code Playgroud)

这是它的工作原理!您只需将上面的"com.company.package.FOO"更改为您的包名(由您的应用程序定义)和有意义的内容.一个例子是"com.testapp.ws.SWAT_FLIES".

为什么你的代码不起作用

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
Run Code Online (Sandbox Code Playgroud)

上面的代码查找特定的Intent操作KIND.记住你制作AndroidManifest和你放的第一个Activity时:

 <action android:name="android.intent.action.MAIN">
 <category android:name="android.intent.category.LAUNCHER">
Run Code Online (Sandbox Code Playgroud)

嗯... getLaunchIntentForPackage()只获取第一个Activity的Intent.这就是为什么我们制作一个自定义的Intent ...首先,因为我们并不真的希望它成为我们的第三个活动才能成为我们的开始......其次,因为操作系统只会告诉我们启动活动.我们必须用我们的OWN行动告诉它(即"com.testapp.ws.SWAT_FLIES")

希望这可以帮助,

FuzzicalLogic


Com*_*are 25

步骤1:<intent-filter>使用自定义操作添加到第三个活动:

<intent-filter>
  <action android:name="com.testapp.ws.SOMETHING_USEFUL"/>
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

步骤2:使用适当的开始该活动Intent:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL"));
Run Code Online (Sandbox Code Playgroud)