让第三方应用直接启动我的活动?

时间:2010-02-21 04:02:53

标签: android

我正在通过意图开展其他第三方想要在自己的应用中使用的活动。

现在,此活动通过意图过滤器捕获网址,如下所示:

<activity android:name=".MyActivity">
  <intent-filter> 
    <action android:name="android.intent.action.VIEW"></action>
    <category android:name="android.intent.category.DEFAULT"></category>
    <category android:name="android.intent.category.BROWSABLE"></category>
    <data android:host="www.mysite.com" android:pathPrefix="/test/" android:scheme="http"></data>
  </intent-filter>
</activity>

以上情况适用,只要用户点击我的应用中的链接,例如:

“mysite.com/test/blah.html”

我的应用程序随浏览器一起选择打开链接。

现在,如果第三方想要使用我的应用程序,我认为他们可以使用上面的内容:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://mysite.com/test/somedata"));
startActivity(intent); 

虽然这样可行,但这可能无法让他们直接从我们的活动中直接跳到他们的活动 - android选择器对话框会出现,询问他们是否想用浏览器或我的应用程序打开意图数据

如何让第三方直接调用我的活动而不广播这样的意图?我想让他们仍然向我传递相同的数据方案,但只是让他们直接打开我的活动。

谢谢

2 个答案:

答案 0 :(得分:3)

您很可能需要他们直接致电您的活动

Class yourClass = Class.forName("com.yourdomain.yourapp.YourClass");
Intent intent = new Intent(this, yourClass);

如果他们没有要连接的jar。否则,他们可以使用

Intent intent = new Intent(this, YourClass.class);    

然后在那里加一些额外的东西。可浏览意图(以及其他意图)的整个概念是为用户提供他们想要查看/使用某些内容的选择。这类似于从媒体查看器中单击“共享”时发生的情况。整个概念是给他们选择。如果有人想要开始您的活动,他们需要明确地调用它。

编辑:除非Dalvik类加载器知道您的类(它可能不会),否则上面的反射示例将无法直接工作。实际上,您需要明确告诉VM从外部程序包加载类。您可以使用以下代码

执行此操作
Context foreignContext = createPackageContext("com.yourdomain.yourapp", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.yourdomain.yourapp.YourClass");

现在他们拥有了类对象,然后他们可以像以前一样触发意图。所以完整的代码就像

Context foreignContext = createPackageContext("com.yourdomain.yourapp", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.yourdomain.yourapp.YourClass");
Intent intent = new Intent(this, yourClass);
startActivity(intent);

答案 1 :(得分:0)

Chris Thompson上面描述的解决方案对我不起作用。这个做了:Android: Starting An Activity For A Different Third Party App

以防任何人遇到与我相同的问题。