【问题标题】:How do I ask for information from another Android application?我如何从另一个 Android 应用程序请求信息?
【发布时间】:2011-04-08 16:14:30
【问题描述】:

我需要第三方应用程序(“Foo”)从我的应用程序(“Bar”)获取信息,但到目前为止我的解决方案似乎很麻烦:

  • 应用程序 Foo 需要来自 Bar 的信息并发送广播(“bar.POLL”)。
  • Application Bar 监听这个广播,并回复另一个广播(“bar.PUSH”);
  • Foo 监听 bar.PUSH 并读取包含的 Bundle 的内容。

有没有更直接的方法来做到这一点?

编辑:我用Guido 建议的极其简单的 ContentProvider 解决了这个问题:

public class MyProvider extends ContentProvider {
  private String state = "";

  @Override
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    MatrixCursor cursor = new MatrixCursor(new String[]{"state"});
    cursor.addRow(new Object[]{state});
    return cursor;
  }

  @Override
  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    state = (String) values.get("state");
    return 1;
  }

  @Override
  public boolean onCreate() {
    return true;
  }

  @Override
  public String getType(Uri uri) {
    return null;
  }

  @Override
  public Uri insert(Uri uri, ContentValues values) {
    return null;
  }

  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
  }    
}

记得将提供者添加到清单中:

<provider android:name=".MyProvider" android:authorities="com.example.hello" />

像这样从 Activity 更新状态:

ContentValues cv = new ContentValues();
cv.put("state", "myNewState");
getContext().getContentResolver().update(Uri.parse("content://com.example.hello"), cv, null, null);

在外部应用中从提供者处获取内容:

Cursor cur = managedQuery(Uri.parse("content://com.example.hello"), null, null, null, null);
if (cur.moveToFirst()) {
  String myContent = cur.getString(0);
}

【问题讨论】:

    标签: android rpc broadcastreceiver android-intent


    【解决方案1】:

    您应该公开ContentProvider

    内容提供程序存储和检索数据,并使其可供所有应用程序访问。它们是跨应用程序共享数据的唯一方式;没有所有 Android 软件包都可以访问的公共存储区域。

    内容提供者实现了一个通用接口,用于查询提供者并返回结果。实现起来并不难,但也许官方文档并不是最好的入门方法。您可以在以下位置找到其他示例:

    【讨论】:

    • 您也可以尝试使用服务。这取决于您要存储/发送的内容
    • Falmarri:我仍然需要某种形式的 RPC 方法,对吧?我已经在 Service 中使用了广播。
    • 如果您使用 ContentProvider,您可以通过向 ContentResolver 查询给定 URI 来查询您需要的数据。我不明白为什么你会在这里需要 RPC-stuff。提供内容是自然的方式,IMO。
    • 嗯。对于手头的任务,ContentProvider 似乎有点矫枉过正。 “Foo”只需要知道“Bar”中布尔标志的当前值...
    • 那可能有点矫枉过正:) 这篇文章解释了如何使用 SharedPreferences 在应用程序之间共享数据。我不知道这是否太棘手,或者它是否有效:“从 Android 中的其他应用程序获取 SharedPreferences”thedevelopersinfo.com/2009/11/25/…
    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多