我正在使用应用抽屉中的搜索功能开发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 ()
。如果我们正在谈论网址,那就是他们需要做的全部事情。否则,他们也应该覆盖void onClick (String url)
,如果他们希望这样做void onLongPress (String url)
这基本上就是一个&#34; Lens&#34;将包括。
那么我必须做些什么(如果可能的话)让其他开发人员能够创建&#34;镜头&#34;对于我的应用?理想情况下,他们可以将它们分发到Google Play商店,但如有必要,我可以开发自己的平台,其他人可以上传他们的镜头。无论哪种方式,我仍然需要一些方法来从我的应用程序中运行别人的代码。
答案 0 :(得分:3)
如果你能想到一个更好的方式(也许就像DashClock那样),我全都听见了:)
围绕IPC设计您的API。让第三方插件实现您的主机应用使用的Service
,ContentProvider
和/或BroadcastReceiver
。虽然使用AIDL的绑定服务似乎是将现有API转换为使用IPC的绑定服务的最自然方式,但插件的绑定服务具有各种各样的问题(例如,API版本控制),这些问题随着时间的推移而变得混乱。 / p>
在您自己的应用程序中,您可以将低级IPC管道包装在一些类似于现有API的类中。如果您希望第三方开发人员使用您发布的某些库来让他们创建插件,那么欢迎您这样做。您需要自己创建一些插件,以测试您的API并为第三方开发人员提供示例。
鉴于所有这些,在安装和删除插件时,您可以发现许多方法。例如,ACTION_PACKAGE_ADDED
和ACTION_PACKAGE_REMOVED
广播可以告诉您何时添加和删除其他应用。然后,您可以使用PackageManager
查看它们是否是您的插件之一(例如,它们是否实现了您的IPC端点?)。或者,使用像PackageManager
这样的queryIntentServices()
方法来轮询插件实现,如果这更有意义的话。
答案 1 :(得分:0)
使用插件的实际应用可能会为您提供想法。以下是使用它们的应用程序的插件开发者页面: