【发布时间】:2014-11-17 16:59:08
【问题描述】:
我正在开发a home screen replacement for Android,并在应用程序抽屉中提供搜索功能。我不仅希望允许(而不是强制)用户搜索已安装的应用程序,还希望允许(而不是强制)用户搜索其他内容,例如 Stack Overflow、Wikipedia 或他们的本地文件。
目前我正在自己开发这些所谓的“镜头”,但我认为如果其他人也能开发它们,那将是一个很酷的想法。所以我想知道是否有任何方法可以让其他开发人员做到这一点;为我的应用开发更多镜头。
所有镜头都应该继承自以下类;
Lens.java
public abstract class Lens
{
protected Context context;
protected Lens (Context context)
{
this.context = context;
}
public abstract List<LensSearchResult> search (String str) throws IOException, JSONException;
public abstract String getName ();
public abstract String getDescription ();
public void onClick (String url)
{
if (url.startsWith ("http://") || url.startsWith ("https://"))
{
Intent intent = new Intent (Intent.ACTION_VIEW);
intent.setData (Uri.parse (url));
this.context.startActivity (intent);
}
else
{
throw new UnsupportedOperationException ();
}
}
public void onLongPress (String url)
{
}
protected String downloadStr (String url) throws IOException, JSONException
{
// Not important. Provided for convenience.
}
protected Drawable downloadImage (String url) throws IOException, JSONException
{
// Not important. Provided for convenience.
}
}
开发人员应将Context 从其构造函数传递给超类,实现List<LensSearchResult> search (String str)、String getName () 和String getDescription ()。如果我们谈论的是一个 URL,这就是他们需要做的所有事情。否则他们也应该覆盖void onClick (String url),如果他们愿意这样做void onLongPress (String url)。
这基本上就是“镜头”的组成部分。
那么我必须做些什么(如果可能的话)才能让其他开发人员能够为我的应用创建“镜头”?理想情况下,他们可以将它们分发到例如 Google Play 商店,但如有必要,我可以开发自己的平台,其他人可以上传他们的镜头。无论哪种方式,我仍然需要某种方式从我的应用程序中运行其他人的代码。
【问题讨论】:
-
“无论哪种方式,我仍然需要一些方法来从我的应用程序中运行其他人的代码”——如果你有任何意义的话。否则,您将成为恶意软件的载体。
-
@CommonsWare 我确实计划实施某种“信任列表”来解决这个问题,但最后,这与用户从 Play 商店安装应用程序有什么不同吗?
-
"这与用户从 Play 商店安装应用程序有什么不同吗?" - 是的,因为应用程序在单独的进程中运行。您当前的 API 不是围绕 IPC 设计的,并且似乎旨在尝试让第三方代码在您自己的进程中运行,这是一个安全漏洞。
-
@CommonsWare Dashclock 做了类似的事情。用户只需安装另一个“扩展”应用程序。该应用程序本身是开源的,因此这可能是一个不错的起点。
-
@NiekHaarman:“Dashclock 做了类似的事情”——使用为 IPC 设计的 API,不需要扩展魔法类等。如果有人想为第三方提供方便的 JAR开发者使用,这很好,但底层协议需要为 IPC 设计和实现。