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

我有两个Android应用程序,假设它们是“A”和“B”,“A”有五个活动,我想从“B”button点击事件中调用它的特定活动。 我testing了从另一个应用程序调用一个应用程序

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

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

这从第一次活动运行“A”,而不是从具体的活动。 我怎样才能打电话给A的指定活动?

格兰特,

这里的问题显然是对Android应用程序模型的一个误解。 Commonsware是完全正确的如何解决这个问题。 但是,如果不理解Android基础知识,我可以看出为什么你很难应用它。 所以,快速解释一下:

Android中的每一个动作都以一个意图开始。 活动尤其如此。 每个活动都有一个意图。 为了使开发人员可以轻松使用界面,您可以从操作系统响应Intent,或者可以从Activities类创build一个Intent以使用。 一般来说,做第一个select是最好的做法。

回应意图

当select一个意图回应,你可以字面上回应任何意图。 这被称为行动。 如果我创build了一个名为“FOO”的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的方式是使用我们创build的SAME NAME(即“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和您放置的第一个活动时:

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

那么… getLaunchIntentForPackage()只能得到第一个Activity的Intent。 这就是为什么我们要制定一个定制的意图…首先,因为我们并不是真的希望它成为我们的第三项活动,第二,因为操作系统只会告诉我们启动活动。 我们必须用我们自己的行动来告诉它(例如“com.testapp.ws.SWAT_FLIES”)

希望这可以帮助,

FuzzicalLogic

步骤#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")); 

这里是从另一个应用程序打开一个应用程序(例如whatsapp)的代码

公共类MainActivity扩展活动{

 /** 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); } }); 

}}

在某些情况下,您可能不会使用两个具有编辑function的应用程序,或者您可能不想制作自定义意图,所以在这种情况下,您可以select一个替代scheme(对可用性进行更好的错误检查):

 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; }