2010-02-21 97 views
1

我正在从事其他第三方希望通过意向在自己的应用中使用的活动。让第三方应用程序直接启动我的活动?

眼下这一活动是通过一个意图过滤器捕获的URL,就像这样:

<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/测试/ blah.html“

我的应用程序作为一个选择,随着浏览器,打开链接。

现在,如果第三方想利用我的应用程序,我认为他们可以用上面这样的:

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

虽然这会工作,这可能不会给他们直接跳跃的预期效果从我的活动 - 他们的android选择器对话框将出现,问他们是否要打开意向数据与浏览器,或我的应用程序。

我该如何让第三方直接打电话给我的活动,而不用像这样广播意图?我想让他们仍然传递相同的确切数据给我,但让他们直接打开我的活动。

谢谢

回答

3

你最有可能需要他们打电话给你的活动直接

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

如果他们没有一个罐子来链接。否则,他们只能使用

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

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

编辑:上面的反射示例不会直接工作,除非Dalvik类加载器知道您的类(它可能不会)。您实际上需要专门告诉虚拟机从外部程序包加载类。你可以用下面的代码来做到这一点

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); 
+0

好吧,我不明白他们如何在他们的源代码中指定“YourClass” - 因为他们不需要在他们的项目中访问我的活动的java文件来引用它吗?谢谢 – user246114 2010-02-21 05:08:45

+0

如果他们无法链接到您的库,则可以使用反射来获取类对象的句柄。 '类。forName(someFullyQualifiedClass)'为全限定类名返回一个类对象。他们需要了解你的课程,但编译器不需要。我用示例代码更新了我的答案。 – 2010-02-21 05:18:00

+0

谢谢克里斯,那有效。如上所述让第三方打电话给我的活动是非标准的还是不好的主意?它仍然是很好的使用意图,我只想定义我的意图,以便它也不会被浏览器应用程序解雇?例如,仍然播出了一个意图,但是定义它的方式是没有其他应用程序可能也会被注册。谢谢 – user246114 2010-02-21 05:42:04

相关问题