在应用程序之间共享drawables

在应用程序之间共享drawables

问题描述:

我在我的应用程序中实现了插件系统。插件作为独立应用程序存在。在应用程序之间共享drawables

在主应用程序中从插件访问drawable的最佳方式是什么?

您有几种选择:

  • ContentProvider - 没有明确需要基于以上SQLite数据库。

  • 清单属性android:sharedUserId

    从文档:

    ,将与其他 应用程序共享一个Linux用户ID的名称。默认情况下,Android会为每个应用程序分配自己的 唯一用户标识。但是,如果对于两个或更多应用程序将此属性设置为相同的值 ,则它们将共享相同的ID - ,前提是它们也由相同的证书签名。 具有相同用户标识的应用程序可以访问彼此的数据,并且如果需要,可以在相同的过程中运行。

    http://developer.android.com/guide/topics/manifest/manifest-element.html#uid

  • PackageManager.getResourcesForApplication()检索与应用程序相关的资源。

    用法:

    PackageManager pm = getPackageManager(); 
    try { 
        Resources resources = pm.getResourcesForApplication("com.example.app"); 
        int id = resources.getIdentifier("ic_launcher", "drawable", "com.example.app"); 
        Drawable d = resources.getDrawable(id) 
    } catch (NameNotFoundException e) { 
        e.printStackTrace(); 
    } 
    
+0

谢谢。如果插件定义了hdpi/mdpi/ldpi drawables呢?如果我将调用'getDrawable',它会为我提供有效的吗? – hsz 2012-07-24 08:52:54

+1

是的,它给你一个有效的。通过调用'getResources()'来获取应用程序包的'Resources'实例,您将获得与您获得的'Resource'对象相同的资源。由于您无法访问插件apk的'R.java'常量定义,因此必须按名称获取资源。你也可以直接查看插件的'R.java',并使用常量'public static final int ic_launcher = 0x7f02001f;'作为id,但这有点棘手。 – biegleux 2012-07-24 09:10:09

+0

我已经注册了'BroadcastReceiver'来获取关于已安装插件的信息,所以我也可以传递插件drawable的资源ID。好吧,我明白一切。非常感谢biegleux! – hsz 2012-07-24 09:14:11

我认为ContentProvider是您的最佳选择。它们专门设计用于“在多个应用程序之间共享数据”。 下面是developer.android参考: http://developer.android.com/reference/android/content/ContentProvider.html 这里是一个详细的指南: http://www.vogella.com/articles/AndroidSQLite/article.html

+0

我不会将图像存储在数据库中。插件将由第三方开发者提供,并且实现整个SQLite来存储图像将会是一个问题。我正在考虑传递资源ID和访问图像。 – hsz 2012-07-24 07:56:27