在Android中显示来自不同应用程序的多个视图

在Android中显示来自不同应用程序的多个视图,android,module,Android,Module,我正在从事一个Android项目,在该项目中,我们设计了一个系统,其理念是任何人都应该能够为整个系统编写一个新的“模块”(该模块是一个单独的包),并且只要名称空间保持不变,就能够与之交互 要将此可视化,请想象一个管理器应用程序,它跟踪数据并为系统中的其他应用程序提供内容提供者。然后,这些应用程序可以使用此ContentProvider向数据库读写数据。这些其他应用程序是三种类型中的一种,一种是记录数据的传感器类型,一种是使用记录的数据并以某种方式对其进行汇总的分析类型,另一种是提供数据特定可视化

我正在从事一个Android项目,在该项目中,我们设计了一个系统,其理念是任何人都应该能够为整个系统编写一个新的“模块”(该模块是一个单独的包),并且只要名称空间保持不变,就能够与之交互

要将此可视化,请想象一个管理器应用程序,它跟踪数据并为系统中的其他应用程序提供内容提供者。然后,这些应用程序可以使用此ContentProvider向数据库读写数据。这些其他应用程序是三种类型中的一种,一种是记录数据的传感器类型,一种是使用记录的数据并以某种方式对其进行汇总的分析类型,另一种是提供数据特定可视化的视图类型

我们要做的一件事是获取一系列视图模块,并在同一页面的管理器中显示它们的可视化效果,据我所知,在这些视图中定义活动或片段需要您打开一个新的活动,离开管理器,只有一个可视化源而不是多个可视化源,这不是我们想要的行为,因为我们想要的是在管理器的同一页面上显示来自多个模块的多个视图


现在我们确实找到了一种方法来实现这一点(在一个应用程序中以编程方式创建视图,并从另一个类远程加载),但它感觉非常粗糙,我真的很想知道是否有更好的方法来实现这一点

我应该说,这是一个教育项目(虽然不是家庭作业-这个问题只是使用了一个有价值的资源),时间有限,因此我们没有时间改变架构,但我确实认为我们在某种程度上扭曲了Android应用程序设计的预期用途

Commonware询问我们如何实际加载自定义视图,这是如何:

public View getView(String packageName, String className, String viewName)
{
    String apkName = context.getPackageManager().getApplicationInfo(packageName, 0).sourceDir;
    PathClassLoader myClassLoader = new PathClassLoader(apkName, ClassLoader.getSystemClassLoader());
    Class<?> handler = Class.forName(className, true, myClassLoader);
    Constructor[] m = handler.getConstructors();
    View returnView = null;
    for(int i = 0; i < m.length;i++)
    {
        if(m[i].getName().contains(viewName))
        {
            Log.i("Blah", m[i].getName());
            returnView = (View)m[i].newInstance(new Object[]{context});

        }
    }
}
public View getView(字符串packageName、字符串className、字符串viewName)
{
字符串apkName=context.getPackageManager().getApplicationInfo(packageName,0).sourceDir;
PathClassLoader myClassLoader=新的PathClassLoader(apkName,ClassLoader.getSystemClassLoader());
Class handler=Class.forName(className,true,myClassLoader);
构造函数[]m=handler.getConstructors();
View returnView=null;
对于(int i=0;i
“在一个应用程序中以编程方式创建视图,并从另一个类远程加载”——您指的是
远程视图吗?如果是这样的话,这就是应用程序小部件和自定义通知背后的引擎,这是IPC上这种UI的最佳支持方法。@Commonware-编辑应该解释我们是如何做到的,我甚至没有听说过RemoteView,这可能值得研究。是的,从可维护性和安全性的角度来看,这并不是一个理想的方法。还要注意的是,您加载的类将无法访问其原始应用程序的资源,尽管您可以使用
createPackageContext()
作为传递到外部视图构造函数的参数来解决这一问题。