14

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

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
startActivity(LaunchIntent);

“com.testapp.ws”是“A”的包名。

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

4

4 回答 4

42

授予,

这里的问题显然是对 Android 应用程序模型的误解。Commonsware 关于如何解决这个问题是绝对正确的。但是,在不了解 Android 基础知识的情况下,我可以理解您为什么难以应用它。所以,一个快速的解释:

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

响应意图

在选择要响应的 Intent 时,您可以逐字地响应任何 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>

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

startActivity(new Intent("com.company.package.FOO"));

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

为什么你的代码不起作用

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");

上面的代码寻找一种特定的 Intent 动作。记住当你制作 AndroidManifest 和你放置的第一个 Activity 时:

 <action android:name="android.intent.action.MAIN">
 <category android:name="android.intent.category.LAUNCHER">

嗯... getLaunchIntentForPackage() 只获取第一个 Activity 的 Intent。这就是我们制作自定义 Intent 的原因……首先,因为我们并不真的希望它成为我们启动的第三个 Activity……其次,因为操作系统只会告诉我们启动 Activity。我们必须用我们的 OWN 动作来告诉它(即“com.testapp.ws.SWAT_FLIES”)

希望这可以帮助,

模糊逻辑

于 2012-06-09T13:23:14.323 回答
27

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

<intent-filter>
  <action android:name="com.testapp.ws.SOMETHING_USEFUL"/>
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

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

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL"));
于 2012-06-09T11:48:55.400 回答
3

在某些情况下,您可能没有使用两个您特别具有编辑功能的应用程序,或者您可能不想制作自定义意图,因此在这种情况下,有一个替代方案(对可用性进行更好的错误检查):

Intent intent = new Intent();
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY");
if (isCallable(context, intent)) {
    // Attach any extras, start or start with callback
} else {
    // Respond to the application or activity not being available
}

在主类或处理通用方法的子类中的某处:

public static boolean isCallable(Activity activity, Intent intent) {
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}
于 2013-08-20T20:13:54.223 回答
1

here is the code to open an app(ex whatsapp) from another app

public class MainActivity extends Activity{

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button bClock = (Button) findViewById(R.id.button1);
    bClock.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    Intent i = new Intent(Intent.ACTION_MAIN);
    PackageManager managerclock = getPackageManager();
    i = managerclock.getLaunchIntentForPackage("com.whatsapp");
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(i);
    }
    });

} }

于 2014-01-26T07:17:42.433 回答